我有以下working example,我试图通过jquery请求获取http://detectlanguage.com。由于这将是一个跨域请求,我正在使用jsonp。
以下a link in MSDN提出了类似的请求,其中jsonp
是最佳选择。
一切都很好,除了页面抛出错误Error: myCallback was not called
,我从服务器得到的响应如下:
{"data":
{"detections":[
{"language":"ca",
"isReliable":false,
"confidence":0.14992503748125938
},
{"language":"en",
"isReliable":false,
"confidence":0.00 8103727714748784
}]
}
}
我一直在stackoverflow中搜索有关jsonp的答案,但还没有让它工作。
非常感谢任何帮助
已更新
包括AJAX调用
$.ajax({
url: 'http://ws.detectlanguage.com/0.2/detect',
data: {
q: $('#hi').val(),
key:'demo'
},
jsonpCallback: 'myCallback',
dataType: "jsonp",
success: myCallback,
error: function(e,i,j){
$('#results').html(j)
}
});
我还有一个名为myCallback
的javascript函数:
function myCallback(response){
alert(response.data)
}
答案 0 :(得分:4)
响应似乎不是jsonp,jsonp响应应该是 javascript 。以下是适用于我的代码。
ajax请求:
$.ajax({
crossDomain: true,
type:"GET",
contentType: "application/json; charset=utf-8",
async:false,
url: "http://<your service url here>/HelloWorld?callback=?",
data: {projectID:1},
dataType: "jsonp",
jsonpCallback: 'fnsuccesscallback'
});
服务器端代码返回jsonp(c#):
public void HelloWorld(int projectID,string callback)
{
String s = "Hello World !!";
StringBuilder sb = new StringBuilder();
JavaScriptSerializer js = new JavaScriptSerializer();
sb.Append(callback + "(");
sb.Append(js.Serialize(s));
sb.Append(");");
Context.Response.Clear();
Context.Response.ContentType = "application/json";
Context.Response.Write(sb.ToString());
Context.Response.End();
}
答案 1 :(得分:0)
我也花了很长时间来寻找答案。我的解决方案与服务有关,而不是ajax调用或jQuery。具体而言,需要设置服务以允许使用web.config中的此设置进行跨域访问:
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
...
<endpoint address="../YourService.svc"
binding="webHttpBinding"
bindingConfiguration="webHttpBindingWithJsonP"
contract="YourServices.IYourService"
behaviorConfiguration="webBehavior" />