2014-02-23 34 views
0

我在尋求一些幫助和解釋,因爲我只是困惑。如何使用ajax執行搶先式REST調用?

我有一個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); 
      }, 

      }); 

我得到的錯誤是「No」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一起工作?

回答

0

它與Java協同工作的原因是Java不會在客戶端的瀏覽器中運行。出於安全原因,瀏覽器將不允許對加載頁面的域以外的域進行JavaScript AJAX請求。例如,如果您從http://www.example.com/加載頁面,則該頁面的javascript將無法對http://api.othersite.com/或甚至http://api.example.com/執行AJAX請求。

有一些解決方法。一個是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。

+0

感謝您的快速回答。另一方面,我敢打賭,你是100%正確的,我不喜歡它:)事情是,在早上我想到了同樣的解決方法(代理請求),然後決定發佈一個問題在stackoverflow得到更好,更短,更簡單的解決方案......我會嘗試另一種方式 –

0

所以我做了joscarsson的建議,當然有效。它涉及了一些額外的工作,我仍然沒有弄清楚如果提交的數據不足以用於外部服務,如何確保我的ajax返回錯誤。儘管如此,這是解決方案,現在我將數據提交給本地資源類,並將包含所有數據的bean委派給一個服務,該服務正在對我想要的應用程序進行適當的後調用