簡體   English   中英

預檢的響應具有無效的HTTP狀態代碼400

[英]Response for preflight has invalid HTTP status code 400

我正在嘗試使用AJAX進行REST調用(POST)。 這是我的AJAX代碼

<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 對預檢請求的響應未通過訪問控制檢查:請求的資源上不存在“Access-Control-Allow-Origin”標頭。 因此不允許原點'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

在做了更多調試后,我發現了這種行為。 發送沒有Authorization標頭的請求時,我收到415(不支持的媒體類型)錯誤。

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

你可以在這里嘗試提到完整的答案。

$.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));
        }
});

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

xhrFields: { withCredentials: true }

如果需要在AJAX調用中傳遞JSON數據,則需要將內容類型指定為json / application,因此服務器知道您正在嘗試發送JSON數據。 但這將改變呼叫的默認內容類型,並且呼叫將有資格進行飛行前檢查,這需要適當的CORS啟用客戶端和服務器請求。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM