我正在尝试使用CURL将简单的POST参数(int)发送到ASP.NET web api控制器POST方法,如下所示:
curl -d "id=1" --ntlm --user <user>:<pass> http://dev.test.local/api/test
这是将数据附加到用于Curl的POST的正确方法吗?我可以很好地联系网址,但似乎参数&#39; id&#39;没有通过,因为我从服务器返回以下错误:
"The parameters dictionary contains a null entry for parameter 'id' of non-nulla
ble type 'System.Int32' for method 'System.String Post(Int32)' in 'Test.Si
te.Controllers.TestController'. An optional parameter must be a reference type,
a nullable type, or be declared as an optional parameter."
我在OrderController中的POST方法如下:
// POST api/test
public string Post(int id)
{
return "Post successful";
}
任何帮助都非常感谢。
答案 0 :(得分:1)
问题是,int
,string
等简单类型不能与来自邮件正文的数据进行模型绑定,除非您明确说明如下:
public string Post([FromBody]int id)
{
return "Post successful";
}
另一个解决方案是您可以从RouteData
或查询字符串中询问这些类型的值。
答案 1 :(得分:1)
我个人会使用简单的DTO并通过JSON调用。
路线:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}",
defaults: new { }
);
控制器&amp; DTO:
[DataContract]
public class valueDto
{
[DataMember]
public int id { get; set; }
}
public class TestController : ApiController
{
// POST api/values
public string Post(valueDto value)
{
return string.Format("Post successful {0}", value.id);
}
}
使用curl调用:
curl -d "{ "id": 1 }" --ntlm --user <user>:<pass> http://dev.test.local/api/test -H "Content-Type:application/json"
但是
只需从tugberk的回答中稍微了解一下,然后引用另一个answer和here。
当您使用FromBody属性时,您还需要将“Content-Type”作为Content-Type发送:application / x-www-form-urlencoded。您还需要更改不具有“id = 1”的呼叫,而是使用“= 1”,例如
curl -d "=1" --ntlm --user <user>:<pass> http://dev.test.local/api/test -H "Content-Type:application/x-www-form-urlencoded"