5

AJAX 请求:

$.ajax({
            url: url,
            dataType: 'json',
            type: 'Post',
            data: {token:"4", feed:{"id":0,"message":"Hello World","userId":4} }
        });

服务器端 Web API:

 [HttpPost]
 public HttpResponseMessage Post(string token, Feed feed)
 {
    /* Some code */

    return new HttpResponseMessage(HttpStatusCode.Created);
 }

错误代码 404: {"message":"找不到与请求 URI 'localhost:8080/api/feed' 匹配的 HTTP 资源。","messageDetail":"在控制器 'Feed' 上找不到与要求。”}

为什么我收到此错误以及为什么我无法将多个参数发布到我的 API?

4

5 回答 5

13

首先编写一个视图模型:

public class MyViewModel
{
    public string Token { get; set; }
    public Feed Feed { get; set; }
}

您的控制器操作将作为参数:

[HttpPost]
public HttpResponseMessage Post(MyViewModel model)
{
    /* Some code */

    return new HttpResponseMessage(HttpStatusCode.Created);
}

最后调整您的 jQuery 调用以将其作为 JSON 发送:

$.ajax({
    url: url,
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({
        token: '4',
        feed: {
            id: 0,
            message: 'Hello World',
            userId: 4
        } 
    })
});

AJAX 调用需要注意的重要事项:

  • 将请求设置contentTypeapplication/json
  • 将数据包装在JSON.stringify函数中以有效地将 javascript 对象转换为 JSON 字符串
  • 删除了无用的dataType: 'json'参数。jQuery 会自动使用Content-Type服务器发送的响应头来推断如何解析传递给success回调的结果。
于 2013-09-22T17:00:22.077 回答
2

我最近遇到了类似的问题,这里有一些关于我如何解决它的信息。我认为问题与 WebApi 如何处理参数有关。你可以在这里这里阅读一些关于它的信息,但基本上有两种方法可以发布参数,在正文中或在 uri 中。body 只能包含一个参数,但它可以是一个复杂的参数,而 uri 可以包含任意数量的参数(最多 uri 字符限制),但它们必须是简单的。当 jquery 执行 POST ajax 调用时,它会尝试传递正文中的所有数据参数,这在您的情况下不起作用,因为正文只能有一个参数。

在代码方面,我认为你需要这样的东西:

var token = "4";
var feed = {Id:0, Message:"Hello World", UserId:4};

$.ajax({
    url: "/api/Feed/?token=" + token,
    dataType: 'json',
    type: 'Post',
    data: JSON.stringify(feed)
});

希望有帮助。

于 2013-10-10T22:42:05.590 回答
2

试试这个服务器端(从内存中你只能有一个 FromBody 参数,所以它需要包含所有传入的属性):

public class TokenAndFeed
{
    public String token {get; set;}
    public Feed feed {get; set;}
}

 public HttpResponseMessage Post([FromBody]TokenAndFeed tokenAndFeed)
 {
    /* Some code */

    return new HttpResponseMessage(HttpStatusCode.Created);
 }
于 2013-09-22T16:44:44.427 回答
1

你可以发布你的Feed课程,只是为了确保属性匹配。

var data = {
     token: "4",
     feed: {Id:0,Message:"Hello World",UserId:4}
}

$.ajax({
            url: "/api/Feed/",
            dataType: 'json',
            type: 'Post',
            data: JSON.stringify(data)
        });
于 2013-09-22T16:36:46.357 回答
0

试试这个。您必须从正文中获取 json 对象数据。读取请求的输入流并将其映射到您的数据模型。

public class TokenAndFeed
{
public string Token { get; set; }
public Feed Feed { get; set; }
}      

[HttpPost]
public HttpResponseMessage Post()
{
    System.IO.Stream str;
    String jsonContents;
    Int32 strLen, strRead;
    str = HttpContext.Current.Request.InputStream;
    strLen = Convert.ToInt32(str.Length);
    byte[] byteArray = new byte[strLen];
    strRead = str.Read(byteArray, 0, strLen);
    jsonContents = Encoding.UTF8.GetString(byteArray);

    TokenAndFeed tAndf = JsonConvert.DeserializeObject<TokenAndFeed>(jsonContents);

    // some code here  
    return new HttpResponseMessage(HttpStatusCode.Created);
    }

希望这会有所帮助。

于 2013-10-28T05:37:39.927 回答