2015-10-20 140 views
4

我正在嘗試使用AJAX進行REST調用(POST)。這是我的AJAX代碼預檢的響應具有無效的HTTP狀態代碼400

<script> 
var settings = { 
"async": true, 
"crossDomain": true, 
"dataType": "json", 
"url": "http://localhost:port/service/myservice", 
"method": "POST", 
"data": '{jsondata}', 
"headers": { 
     "accept": "application/json", 
     "Authorization": "authValue" 
    } 
} 

$.ajax(settings) 

.done(function (response) { 
    console.log(response); 
}); 
</script> 

起初,我得到這個錯誤:的XMLHttpRequest無法加載http://localhost:port/service/myservice。對預檢請求的響應不會通過訪問控制檢查:請求的資源上不存在「訪問控制 - 允許來源」標頭。因此不允許原產地'null'訪問。響應有HTTP狀態代碼400

要解決此問題,我添加以下代碼在我dropwizard應用

Dynamic filter = env.servlets().addFilter("CORS", CrossOriginFilter.class); 

filter.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,PUT,POST,DELETE,OPTIONS"); 
filter.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*"); 
    filter.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*"); 
filter.setInitParameter("allowedHeaders", "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin"); 
filter.setInitParameter("allowCredentials", "true"); 

filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); 

加入這個我最初的異常走之後,但我發現以下異常:XMLHttpRequest無法加載http://localhost:port/service/myservice。預檢的響應具有無效的HTTP狀態代碼400

此問題與CORS相關嗎?我在這裏做錯了什麼?

UPDATE

做更多的調試後,我發現這種行爲。當發送沒有授權標題的請求時,我收到415(不支持的介質類型)錯誤。

我認爲我的AJAX代碼有問題,有人可以幫我找到問題嗎?謝謝。

回答

0

嘗試將以下內容添加到您的設置中?

xhrFields: { withCredentials: true } 
1

您可以嘗試here作爲完整答案在本主題中提及。

$.ajax({ 
     type:"POST", 
     beforeSend: function (request) 
     { 
      request.setRequestHeader("Authority", authValue); 
     }, 
     url: "http://localhost:port/service/myservice", 
     data: "json=" + escape(JSON.stringify(createRequestObject)), 
     processData: false, 
     success: function(msg) { 
      $("#results").append("The result =" + StringifyPretty(msg)); 
     } 
}); 
0

,如果你需要傳遞在AJAX調用JSON數據,你需要指定內容類型爲JSON /應用程序,以便服務器知道你要發送JSON數據。但是這將改變呼叫的默認內容類型,並且該呼叫將有資格進行飛行前檢查,這需要適當的啓用CORS的客戶端請求服務器&。

爲了更簡單的用例,在傳遞數據時不要使用JSON.stringify(),只需使用{key:value,key:value,...}格式創建一個簡單字符串,並將該字符串作爲數據傳遞。 Ajax調用默認情況下序列化數據並執行正確的操作,並且該調用保持爲服務器的單個POST調用,其中,預飛行模式爲兩次調用。

相關問題