簡體   English   中英

嘗試在Java Spring中獲取JSON時為什么會出現406錯誤?

[英]Why am I getting a 406 error when trying to get JSON in Java Spring?

當我通常使用Java Spring作為返回JSON數據的控制器端點時,我的返回類型通常是String 我將toString()我的JSON對象並將其解析為Javascript。 最近,我在某處讀到不是“正確”的方法(嘗試遵循最佳實踐和准則)。 我正在啟動一個新項目,該項目的返回類型為JSON對象(依賴關系為org.json )。

當我嘗試在瀏覽器中命中端點時,出現406錯誤,描述為“此請求標識的資源只能根據請求“接受”標頭生成特性不可接受的響應”。

這是我的端點現在的樣子:

@RequestMapping(value = "/api/get-items", method = {RequestMethod.GET, RequestMethod.POST}, headers = "Accept=application/json")
@ResponseBody
public JSONObject doGetItems(HttpServletRequest request, HttpServletResponse response) {
    JSONObject data = new JSONObject();
    JSONArray items = new JSONArray();
    JSONObject item1 = new JSONObject().put("id", 123);
    JSONObject item2 = new JSONObject().put("id", 456);
    JSONObject item3 = new JSONObject().put("id", 789);
    items.put(item1).put(item2).put(item3);
    data.put("data", items);
    return data;
}

我如何使它工作並返回JSON? 還是我應該返回JSON對象的字符串化版本,而且我一直都在正確地執行此操作?

更新資料

首先,我嘗試刪除@RequestMapping批注中的headers參數。 我仍然出現406錯誤。

然后,我嘗試更改/添加@RequestMapping批注中的參數,也沒有運氣。 這就是我嘗試將其更改為:

@RequestMapping(value = "/api/get-items",
                method = {RequestMethod.GET, RequestMethod.POST},
                headers = "Accept=*/*",
                produces = MediaType.APPLICATION_JSON_VALUE)

我仍然收到406錯誤。

超文本傳輸​​協議(HTTP) 406不可接受的客戶端錯誤響應代碼表示服務器無法生成與請求的主動內容協商標頭中定義的可接受值列表匹配的響應,並且服務器不願提供默認表示。

主動式內容協商標頭包括:

客戶端(例如您的Web瀏覽器或我們的CheckUpDown機器人)可以向Web服務器(正在運行該網站)指示其將從Web服務器接收回的數據的特征。 這是使用以下類型的“接受標頭”完成的:

接受:客戶端接受的MIME類型。 例如,瀏覽器只接受其知道如何處理的數據的后退類型(HTML文件,GIF文件等)。

接受字符集客戶端接受的字符集。

接受編碼:客戶端接受的數據編碼,例如它可以理解的文件格式。

接受語言:客戶接受的自然語言(英語,德語等)。

接受范圍:客戶端是否接受來自資源的字節范圍,即資源的一部分。

通過在客戶端更改或刪除標頭內容,它應該可以工作。

當您指定headers = "Accept=application/json" ,則表示必須存在一個Accept標頭,並具有該值。

客戶端沒有發送該值,也沒有理由發送該值,因為Accept標頭值是逗號分隔的可接受值列表,因此它只需要列出application/json ,不必指定該值。

要修復,請將headers = "Accept=application/json"替換為produces = "application/json"

當然,客戶端仍然需要指定application/jsonapplication/**/*是可接受的。

暫無
暫無

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

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