JSONP对象错误

时间:2013-02-06 21:10:45

标签: javascript jquery jsonp

我正在尝试发送跨域请求来发送/接收一些数据。我无法超越object error。在我收到No Transport错误之前,添加Query.support.cors = true;解决了这个问题。

var url = "http://CROSSDOMAINSERVER:PORT/Service1.svc/GetDataUsingDataContract";
            $.ajax({
                type: 'GET',
                url: url,
                data: 'tool=1&product=Some%20Product&details=9&bogus=should%20not%20pass%20validation', 
                datatype: "jsonp",
                contentType: "application/json",
                success: function (response) {
                    alert(response.data);
                },
                error: function (error) {
                    alert(error.statusText);
                }
            });

如果我在浏览器中输入网址:

 http://CROSSDOMAINSERVER:PORT/Service1.svc/GetDataUsingDataContract?&tool=1&product=Some%20Product&details=9&bogus=should%20not%20pass%20validation

我得到了正确的回复。

{"d":{"__type":"ClientSideData:#ProdResourceToolService","details":"9","product":"Some Product","result":"1","site":"Somewhere, SD","systime":"2\/6\/2013 2:50:20 PM","team":"0000000000","tool":"1","user":"username"}}

当我使用ajax时,它不会将其提交到数据库或返回数据,只是object error。有没有人对如何解决这个问题有任何建议?

我还应该指定在本地调试时是否从http://CROSSDOMAINSERVER:PORT/删除var url我得到了正确的json响应。为什么跨域不起作用?

1 个答案:

答案 0 :(得分:3)

这是您当前的回复:

{
    "d": {
        "__type": "ClientSideData:#ProdResourceToolService",
        "details": "9",
        "product": "Some Product",
        "result": "1",
        "site": "Somewhere, SD",
        "systime": "2/6/2013 2:50:20 PM",
        "team": "0000000000",
        "tool": "1",
        "user": "username"
    }
}

这是一个有效的JSON字符串。但是,它无效JSONP。如果可能的话,让你的服务将json包装在一个函数中:

responseFunc({
    "d": {
        "__type": "ClientSideData:#ProdResourceToolService",
        "details": "9",
        "product": "Some Product",
        "result": "1",
        "site": "Somewhere, SD",
        "systime": "2/6/2013 2:50:20 PM",
        "team": "0000000000",
        "tool": "1",
        "user": "username"
    }
});

$.ajax()来电中,添加一个属性:jsonpCallback: 'responseFunc'

另外,我建议将data作为对象传递:

data: { tool: 1, product: 'Some Product' } //etc...

如果您可以从服务器端访问服务而没有任何问题,您可以创建一个httphandler(例如.ashx)并让它为您生成JSON。那么你就不必在客户端处理跨域问题了。