4

我刚刚遇到了一个关于通过 asp.net webservice 检索数据的奇怪问题。

使用 JQuery 的 ajax 方法时,标头设置正确,数据在 JSON 中成功检索。

JSON 示例:

$.ajax({
    type: "GET",
    url: "service/TestService.asmx/GetTestData",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: callback,
    error: function (err, xhr, res) {
      alert(err);
    }
  });

上述请求标头如下:

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Type    application/json; charset=utf-8
Host    localhost
Referer http://localhost/
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
X-Requested-With    XMLHttpRequest

以上的响应标头如下:

Cache-Control   private, max-age=0
Content-Length  327
Content-Type    application/json; charset=utf-8
Date    Tue, 29 Oct 2013 17:59:56 GMT
Server  Microsoft-IIS/7.5
X-AspNet-Version    4.0.30319
X-Powered-By    ASP.NET

这很好用。

但是对于 AngularJS $http 方法,Request Headers Content-Type 值没有设置,因此 Response Headers Content-Type 默认为text/xml; charset=utf-8. 看看下面的例子:

$http({
    method : 'GET',
    url: 'service/TestService.asmx/GetTestData',
    headers: {
      'Accept': 'application/json, text/javascript, */*; q=0.01',
      'Content-Type': 'application/json; charset=utf-8'
    }
  }).success(callback);

上面的请求标头如下,您会看到缺少 Content-Type:

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Host    localhost
Referer http://localhost/ComponentsAndRepos/
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0

因此,上述响应标头如下:

Cache-Control   private, max-age=0
Content-Encoding    gzip
Content-Length  341
Content-Type    text/xml; charset=utf-8
Date    Tue, 29 Oct 2013 17:59:56 GMT
Server  Microsoft-IIS/7.5
Vary    Accept-Encoding
X-AspNet-Version    4.0.30319
X-Powered-By    ASP.NET

因此这会强制响应返回为 XML 而不是 JSON,有没有办法解决这个问题?

谢谢你,

更新 感谢 Erstad Stephen

这已通过向方法添加data:{}属性来解决$http

    $http({
    method : 'GET',
    url: 'service/TestService.asmx/GetTestData',
    data: {},
    headers: {
      'Accept': 'application/json, text/javascript, */*; q=0.01',
      'Content-Type': 'application/json; charset=utf-8'
    }
  }).success(callback);
4

1 回答 1

2

您可以通过几种不同的方式处理此问题:

  1. 您可以通过 $httpProvider 设置标头默认值:http://docs.angularjs.org/api/ng .$http#description_setting-http-headers
  2. 您还可以使用 Angular 中的拦截器来拦截 $http 的想法,以修改所有请求的配置对象:http: //docs.angularjs.org/api/ng .$http#description_interceptors
  3. 您也可以像上面一样设置配置设置。

最大的问题是您可能误解了配置的工作原理。在此处查看此问题:Angular, content type is not being generated correct when using resource

于 2013-10-29T18:34:40.153 回答