1

我正在尝试使用 CURL 将简单的 POST 参数(一个 int)发送到 ASP.NET Web api 控制器 POST 方法,如下所示:

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


这是将数据附加到 POST for Curl 的正确方法吗?我可以很好地联系 URL,但似乎没有传递参数“id”,因为我收到了从服务器返回的以下错误:

"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";
    }


任何帮助深表感谢。

4

2 回答 2

1

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

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

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

于 2012-08-07T07:18:09.310 回答
1

就我个人而言,我会使用一个简单的 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"

只是从 tugberk 的回答中稍作跟进,并在此处引用另一个答案

当您使用 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"
于 2012-08-07T08:12:57.047 回答