jsonp返回json但没有进入成功块。那么我如何捕获数据呢?

时间:2014-05-14 15:25:04

标签: javascript jquery ajax json

嗨,我是棱角分明并试图学习东西。

我试图从跨域获取json文件。这是我写的一段代码。现在我发现尽管JSON从服务器返回并且我得到了201状态响应。错误块被击中。

从堆栈溢出中的一个链接中我发现无法使用异步ajax调用进行错误处理。那么将数据绑定到$ scope.greeting的好方法是什么?

$http.jsonp('http://marco.factset.com/caches.json').
    success(function(data) {
        $scope.greeting = data;
        alert($scope.greeting);
    }).
  error(function(data, status) {
      console.log( data + " Request failed " + status);
      $scope.status = status;
  });

});

以下是在firebug中看到的http响应。

Response Headersview source
Cache-Control   no-cache
Connection  close
Content-Encoding    gzip
Content-Length  12178
Content-Type    application/json; charset=utf-8
Date    Wed, 14 May 2014 16:31:27 GMT
Server  Mongrel 1.1.5
Set-Cookie  _marco4_session=BAh7CDoPc2Vzc2lvbl9pZCIlODBiOTFjMDA2MDcyM2NhYzE1MjA2NDE5NDQ0ZjdhOTgiDmFzOmNhY2hlc3sGOglsaXN0ewAiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7AAY6CkB1c2VkewA%3D--d4c4f3af3a2fe24cde206eaea2bd8097601c48c5; path=/; HttpOnly
Status  201
Vary    Accept-Encoding
Via 1.1 marco
X-Runtime   464
Request Headersview source
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Authorization   Basic ZHJveTphcHJpbEAxMjM=
Cache-Control   max-age=0
Connection  keep-alive
Cookie  _marco4_session=BAh7CCIOYXM6Y2FjaGVzewY6CWxpc3R7ADoPc2Vzc2lvbl9pZCIlODBiOTFjMDA2MDcyM2NhYzE1MjA2NDE5NDQ0ZjdhOTgiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7AAY6CkB1c2VkewA%3D--b1fbe53b408aad4d99240aa9b9348984dd7afca4
Host    marco.factset.com
Referer http://localhost:63342/qaweb3/app/index.html
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 FirePHP/0.7.4
x-insight   activate

以下是我收到的JSON摘录。

[{"cache": {"config": "/home/fds/metp/FDSadx_tp/etc/adx_tp.cfg", "updated_at": "2012-11-15T02:00:20Z", "product_developer_id": 55, "name": "adx", "secondary_engineer_id": 42, "ftok": 43, "cachetype": "tp", "primary_engineer_id": 66, "service_name": null, "id": "adx", "created_at": "2012-02-22T09:01:41Z"}}, {"cache": {"config": "/home/fds/metp/FDSadx_xstream_tp/etc/adx_tp.cfg", "updated_at": "2014-04-17T10:56:14Z", "product_developer_id": 55, "name": "adx_xstream", "secondary_engineer_id": 24, "ftok": 42, "cachetype": "tp", "primary_engineer_id": 70, "service_name": null, "id": "adx_xstream", "created_at": "2013-11-21T11:45:03Z"}}, {"cache": {"config": "/home/fds/metp/FDSamman_tp/etc/amman_tp.cfg", "updated_at": "2011-12-12T19:47:02Z", "product_developer_id": null, "name": "amman", "secondary_engineer_id": 22

编辑1:

服务器不支持jsonp,因此使用回调函数不起作用,因为json数据不是由作为参数传递的函数名包装的。有没有解决跨域http请求的工作?

 function handle_data(data) {
          // `data` is now the object representation of the JSON data
          alert("Got data " +  data );
      }

       var url = "http://http://marco.factset.com/caches.json?callback=handle_data";

      $http.jsonp(url).
          success(function(data, status, headers, config) {
            alert("Success")
          }).
          error(function(data, status, headers, config) {
              alert("Failure");
          });

2 个答案:

答案 0 :(得分:1)

所以最后我得到了这个工作,服务器没有启用JSONP,但我有权在域内安装我自己的JSONP服务,所以我向这个自定义服务发出了jsonp请求,这个服务反过来变得简单获取对同一域中的实际服务的请求,结果将转换为jsonp格式。

以下是角度控制器的摘录。

    $http({method: 'JSONP', url: 'http://unixdeva10.myurl.com:9643/jsonprouter?callback=JSON_CALLBACK&key=caches.json'}).
      success(function(data, status, headers, config) {
          process_response(data);
      }).
      error(function(data, status, headers, config) {
          alert("Failed");
      });

答案 1 :(得分:-1)

您需要弄清楚错误块被命中的原因,解决该问题并继续使用您的成功方法。

代码201成功(创建)