Jersey 如何使用ajax进行抢占式REST调用?

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

我只是感到困惑,所以我想寻求一些帮助和解释

我有一个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 + ':' + 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);