Jersey 如何使用ajax进行抢占式REST调用?
我只是感到困惑,所以我想寻求一些帮助和解释 我有一个jQuery函数,通过ajax,它可以对某个服务器进行POST调用Jersey 如何使用ajax进行抢占式REST调用?,jersey,preemptive,Jersey,Preemptive,我只是感到困惑,所以我想寻求一些帮助和解释 我有一个jQuery函数,通过ajax,它可以对某个服务器进行POST调用 var login = $("#email1").val(); var password = $("#password1").val(); var summary = $("#summary").val(); var details = $("#details").val(); var address = $("#address").val(); var str = login
var login = $("#email1").val();
var password = $("#password1").val();
var summary = $("#summary").val();
var details = $("#details").val();
var address = $("#address").val();
var str = login + ':' + password;
var credentials = utf8_to_b64(str);
function utf8_to_b64( str ) {
return window.btoa(unescape(encodeURIComponent( str )));
}
$.ajax({
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Basic " + credentials);
},
crossDomain: true,
//fails with or without next two arguments
username: login,
password:password,
url: "https://blablablasomethingrelevant",
type: "POST",
dataType: "json",
contentType: "application/json",
data: JSON.stringify({"fields":{properdatahere}}),
async: false,
success: function (data) {
alert(data);
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
alert(xhr.responseText);
alert(xhr);
},
});
我得到的错误是“请求的资源上不存在“Access Control Allow Origin”头”。当然,我在谷歌上搜索了一下,答案总是“自我解释”的blabla错误,服务器端的错误,我需要在那里做一些技巧。如果我无法使用所有其他技术执行相同的POST调用,这些答案将是有意义的
当我对java做了完全相同的操作时,使用jersey客户端工作得很好,使用wiztools.org的rest客户端也一样(必须勾选preemptive选项)
那么,有人能告诉我为什么它可以与java和jersey一起工作,而不能与jquery和ajax一起工作吗?如何使它最终使用ajax?它使用Java的原因是Java没有在客户端浏览器中运行。出于安全原因,浏览器将不允许向加载页面的域以外的域发出Javascript AJAX请求。例如,如果您从
http://www.example.com/
,该页面的javascript将无法对http://api.othersite.com/
甚至http://api.example.com/
有一些变通办法。一个是JSONP(),另一个是设置CORS头()。这两种方法都需要更改您正在调用的API,因此您不能仅在自己的一方解决它
您可以在服务器上添加资源,例如
http://www.example.com/api/resource
然后,在您的后端(您的情况下是Java?)中,哪个会向http://api.othersite.com/
使用与您在问题中编写的代码类似的代码。然后,Javascript可以调用http://www.example.com/api/resource
没有问题。简而言之,您正在通过后端将请求代理给第三方API。所以我按照joscarsson的建议做了,这当然奏效了。这涉及到一些额外的工作,我仍然没有弄清楚如果提交的数据不足以提供外部服务,如何确保我的ajax返回错误。尽管如此,这就是解决方案,现在我将数据提交到本地资源类,并将一个包含所有数据的bean委托给一个服务,该服务正在对我想要的应用程序进行适当的post调用,感谢您的快速回答。另一方面,我打赌你是100%正确的,我不喜欢:)事情是早上我考虑了同样的解决方法(代理请求),然后决定发布一个关于stackoverflow的问题,以获得更好、更短、更简单的解决方案。。。那我就换个方向试试
Client client = Client.create();
client.addFilter(new com.sun.jersey.api.client.filter.HTTPBasicAuthFilter(login, password));
WebResource webResource = client.resource("https://blablablasomethingrelevant");
String input = "{"fields":{properdatahere}";
ClientResponse response = webResource.type("application/json").post(ClientResponse.class, input);