0

我正在寻求一些帮助和解释,因为我很困惑。

我有一个 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 客户端也一样(必须勾选选项抢占式)

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);

那么有人能告诉我为什么它适用于 java 和 jersey 而不是 jquery 和 ajax 吗?如何使它最终与 ajax 一起工作?

4

2 回答 2

0

它与 Java 一起工作的原因是 Java 不在客户端的浏览器中运行。出于安全原因,浏览器将不允许向页面加载域以外的域发出 Javascript AJAX 请求。例如,如果您从 加载页面http://www.example.com/,则该页面中的 javascript 将无法对http://api.othersite.com/甚至进行 AJAX 请求http://api.example.com/

有一些解决方法。一个是 JSONP ( http://en.wikipedia.org/wiki/JSONP ),另一个是设置 CORS 标头 ( http://en.wikipedia.org/wiki/Cross-origin_resource_sharing )。两者都需要更改您正在调用的 API,因此您无法仅靠自己解决它。

您可以做的是在您的服务器上添加一个资源,例如http://www.example.com/api/resource,然后在您的后端(在您的情况下是 Java?)中请求http://api.othersite.com/使用类似于您在问题中编写的代码。然后您的 Javascript 可以http://www.example.com/api/resource毫无问题地调用。简而言之,您通过后端将请求代理到第三方 API。

于 2014-02-23T11:53:08.010 回答
0

所以我按照 joscarsson 的建议做了,这当然奏效了。它涉及一些额外的工作,如果提交的数据不足以用于外部服务,我仍然不知道如何确保我的 ajax 返回错误。尽管如此,这就是解决方案,现在我将数据提交给本地资源类,并将一个包含所有数据的 bean 委托给一个服务,该服务正在对我想要的应用程序进行适当的后期调用

于 2014-02-28T13:14:19.153 回答