Web API调用不返回Aurelia JS控制器的响应?

时间:2018-02-14 14:43:27

标签: asp.net-mvc asp.net-web-api2 aurelia

我正在从Aurelia JS调用Web API控制器,但我没有从Web API控制器那里得到任何响应。

这是我的代码:

httpClient.fetch('/api/controllername', {
  method: "POST",
  headers: {
    'content-type': 'application/json'
  },
  body: JSON.stringify(passvaluetocontroller)
})
.then(response => response.json())
.then(data => {
  alert(data);
  alert("success");
});

这是我的控制器代码:

public HttpResponseMessage Post(passvaluetocontroller s)
{
  return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}

所以我没有得到任何响应,并且它在控制台中显示错误: Uncaught(承诺) SyntaxError:

  

JSON输入的意外结束。

请求成功后如何工作?

1 个答案:

答案 0 :(得分:3)

原因很简单。您实际上并没有从控制器方法发送任何内容:

public HttpResponseMessage Post(passvaluetocontroller s)
{
    return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}

通过HttpResponseMessage方法System.Net.HttpStatusCode.Accepted传递,您正在创建一个响应,其标题包含Accepted状态代码,但其正文为空。因此,没有什么可以反序列化。如果响应为空,response.json()将失败,这就是您收到错误的原因。

有两种可能的解决方案:

  • 如果您甚至不打算从服务器发送任何实际内容,那么就不要打电话给response.json(),因为您不需要任何内容​​。在这种情况下,在.then(...)方法中,只需检查response.ok即可。执行此操作将告诉您响应是否表示成功操作 - 即响应状态代码为2xx
  • 如果您确实要反序列化某些内容,那么只需从服务器发送一些内容即可反序列化。你可以这样做:
public object Post(passvaluetocontroller s)
{
    return new { Test = "Test" };
}

显然,您可以将object返回类型更改为您想要的任何内容,因此您可以在操作方法中返回您喜欢的对象。