我正在尝试创建jsonp请求的服务器端和客户端,我似乎无法使其工作。我看了很多指南,博客文章等,但几乎每个人都只展示了客户端。
这是我的客户代码
$.ajax({
dataType: 'application/json',
data: params,
jsonp: 'jsonpCallback',
url: settings.domain + '/httpext.dll?json_cc',
success: function (data) {
//determine the return status
},
error: function (response, status, error) {
//error handling
}
}); //end ajax
现在,服务器正在返回一个像这样的
的硬编码值jsonpCallback({"username":"meltingice","posts"1234});
我的问题是我无法得到请求和响应一起工作。目前,响应正在返回application / json,所以如果我改变了我的请求,那么期望jsonp错误
资源解释为脚本,但使用MIME类型application / json进行传输。 未捕获的ReferenceError:未定义jsonpCallback
首先,如您所见,我已经定义了jsonpCallback。
现在,如果我将dataType更改为application / json,那么我会收到此错误
XMLHttpRequest cannot load http://myserver/httpext.dll?json_cc&sid=adsfhasjdkfhajksdghjk%3Basdhg&action=SALE&ccCard=&ccNum=&ccExMM=0&ccExYYYY=0&ccCVV2=&holdersName=&totalDue=0&dueDate=11%2F19%2F2010. Origin http://localhost:59905 is not allowed by Access-Control-Allow-Origin.
正如您所看到的,它没有将callback=?
放入网址。这令人沮丧。
如何设置服务器端以便我可以使用jsonp调用它?响应类型需要什么?如何格式化返回的数据,以便我的客户端代码可以撤回数据?
答案 0 :(得分:5)
这不起作用的原因是因为您的服务器始终返回硬编码的方法名称,而您的客户端使用的是匿名success
处理程序。这不行。您需要将服务器配置为使用作为参数传递的方法名称,否则它将永远不会在客户端调用success
回调。因此,一旦您将服务器配置为考虑jsoncallback
查询参数,就可以像这样测试它:
$.getJSON(settings.domain + '/httpext.dll?json_cc&jsoncallback=?', params, function(result) {
alert('success');
});
现在服务器将收到一个如下所示的请求:
http://foo.com/httpext.dll?json_cc&jsoncallback=jsonp1290183992345
它应该像这样回应:
jsonp1290183992345({"username":"meltingice","posts"1234});
显然也是Content-Type
application/json
。
答案 1 :(得分:1)
我还想提供我在ASP.NET MVC中使用的代码片段来处理jsoncallback。
private static ActionResult GetContent(object data, string callback)
{
if (!string.IsNullOrEmpty(callback))
{
ContentResult result = new ContentResult();
result.ContentType = "application/json";
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(data);
result.Content = string.Format("{0}({1})", callback, json);
return result;
}
else
{
JsonResult result = new JsonResult();
result.Data = data;
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return result;
}
}