CURL中的POST参数

CURL中的POST参数,post,curl,asp.net-web-api,Post,Curl,Asp.net Web Api,我试图使用CURL向ASP.NET web api控制器POST方法发送一个简单的POST参数(int),如下所示: curl -d "id=1" --ntlm --user <user>:<pass> http://dev.test.local/api/test 我在OrderController中的POST方法如下: // POST api/test public string Post(int id) { return "P

我试图使用CURL向ASP.NET web api控制器POST方法发送一个简单的POST参数(int),如下所示:

curl -d "id=1" --ntlm --user <user>:<pass> http://dev.test.local/api/test

我在OrderController中的POST方法如下:

    // POST api/test
    public string Post(int id)
    {
        return "Post successful";
    }


非常感谢您的帮助。

问题在于,诸如
int
string
等简单类型不能与消息正文中的数据进行模型绑定,除非您明确地告诉它,如下所示:

public string Post([FromBody]int id)
{
    return "Post successful";
}

另一种解决方案是,您可以从
RouteData
或查询字符串中询问这些类型的值。

我个人会使用一个简单的DTO并通过JSON调用

路线:

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}",
            defaults: new {   }
        );
控制器和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"
curl-d{“id”:1}--ntlm--用户:http://dev.test.local/api/test -H“内容类型:应用程序/json”
但是

接下来是tugberk的回答,并引用了另一个和

使用FromBody属性时,还需要将“内容类型”作为内容类型发送:application/x-www-form-urlencoded。您还需要更改没有“id=1”的调用,而是使用“=1”,例如

curl-d“=1”--ntlm--用户:http://dev.test.local/api/test -H“内容类型:应用程序/x-www-form-urlencoded”

如果您想知道
curl
到底发送了什么,可以运行
curl--trace ascii curl.log-d id=1…
,然后查看
curl.log
(这将向您显示
curl
正在生成一个完全正常的
POST
请求)Ok,我查看了日志,错误与上面列出的相同?@davey1990,是否有可能curl发送的数据被解释为字符串而不是整数,因此被.net以某种方式清除?考虑改变你的函数来接受一个字符串,然后让我们知道这是否有帮助。谢谢马克,这种方式是正确的。我选择创建自己的模型对象,然后自动绑定参数。这种方法也适用于简单类型,但最终我将构建复杂的数据类型。谢谢
curl -d "{ "id": 1 }" --ntlm --user <user>:<pass> http://dev.test.local/api/test -H "Content-Type:application/json"
curl -d "=1" --ntlm --user <user>:<pass> http://dev.test.local/api/test -H "Content-Type:application/x-www-form-urlencoded"