我正在用C#制作一个webapi应用程序。我正在使用postman将请求发送到api,但是在调用函数时,接收的参数为null。
似乎C#没有看到帖子消息的任何内容。
这是我的WebApiConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace Lab1_v5
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
这是控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Lab1_API.Models;
namespace Lab1_API.Controllers
{
public class OperacionController : ApiController
{
public Operacion ProcesarResultado(Operacion op)
{
return Models.Operacion.Procesar(op);
}
}
}
这是模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Lab1_API.Models
{
public class Operacion
{
private double value1, value2, resultado;
private int tipoOperacion;
public double Value1 { get => value1; set => value1 = value; }
public double Value2 { get => value2; set => value2 = value; }
public double Resultado { get => resultado; set => resultado = value; }
public int TipoOperacion { get => tipoOperacion; set => tipoOperacion = value; }
public Operacion(double pvalue1, double pvalue2, double presultado, int ptipoOperacion)
{
this.Value1 = pvalue1;
this.Value2 = pvalue2;
this.Resultado = presultado;
this.TipoOperacion = ptipoOperacion;
}
public Operacion(double pvalue1, double pvalue2, int ptipoOperacion)
{
this.Value1 = pvalue1;
this.Value2 = pvalue2;
this.Resultado = 0;
this.TipoOperacion = ptipoOperacion;
}
public static Operacion Procesar(Operacion op)
{
double result = 0;
switch (op.tipoOperacion)
{
case 1:
result = op.Value1 + op.Value2;
break;
case 2:
result = op.Value1 - op.Value2;
break;
case 3:
result = op.Value1 * op.Value2;
break;
case 4:
result = op.Value1 + op.Value2;
break;
}
op.resultado = result;
return op;
}
}
}
我发送的是带有标题"application/json"
的Json:
{
"Value1":1.0,
"Value2":1.0,
"Resultado":0.0,
"TipoOperacion":1
}
我已经尝试过几乎所有的东西,我似乎无法理解为什么我在控制器中得到一个null。
编辑 -
我用来访问webapi的网址是:http://localhost:55236/api/Operacion/ProcesarResultado。
答案 0 :(得分:2)
您需要添加HttpPost属性或使用Post。
启动方法名称[HttpPost]
public Operacion ProcesarResultado(Operacion op)
{
return Models.Operacion.Procesar(op);
}
或
public Operacion PostProcesarResultado(Operacion op)
{
return Models.Operacion.Procesar(op);
}
答案 1 :(得分:1)
您应该指定请求的标头。尝试添加
Content-Type: application/json
答案 2 :(得分:1)
您需要指定控制器上的方法用于POST请求。使用HttpPost
属性。
[HttpPost]
public Operacion ProcesarResultado(Operacion op)
{
return Models.Operacion.Procesar(op);
}
答案 3 :(得分:0)
您可以尝试使用FromBodyAttribute
标记参数,如下所示:
[HttpPost]
public Operacion ProcesarResultado([FromBody] Operacion op)
{
return Models.Operacion.Procesar(op);
}
这应该建议反序列化请求体的框架。没有它,它可能会期待表单数据。
答案 4 :(得分:0)
问题在于您的构造函数。 快速解决: 只需添加无参数构造函数:
public Operacion()
{
}
并且不要忘记正确命名您的操作(使用:Post开始操作名称)或在操作定义之前添加[HttpPost]属性(如果您将其保留为此可能会增加更多问题)。
答案 5 :(得分:0)
除了可能没有将您的方法标记为接受POST请求之外,您的模型缺少无参数构造函数。它应该是
public class Operacion
{
private double value1, value2, resultado;
private int tipoOperacion;
public double Value1 { get => value1; set => value1 = value; }
public double Value2 { get => value2; set => value2 = value; }
public double Resultado { get => resultado; set => resultado = value; }
public int TipoOperacion { get => tipoOperacion; set => tipoOperacion = value; }
public Operacion()
{
}
// other constructors and methods
}
框架需要无参数构造函数来实例化您的类,因为它不能使用带有参数的构造函数,因为它不知道如何填充它们。
如果您的模型没有明确声明任何构造函数,则会自动生成默认的无参数构造函数。