一、背景
服務器軟件用Spring boot開發,API調用的響應消息格式為JSON。
對端調用接口后無法解析響應。
抓包看Response的Body部分確實是正確的JSON格式字符串。
二、問題分析
繼續分析日志發現對端收到的響應消息類型是text/plain?!
對端解析先判斷消息類型,這是無法按照JSON格式解析的。
三、問題解決
1. 網上流傳最廣泛的兩種說法:
1.1 在類上使用注解@RestController
1.2 在方法上使用注解@ResponseBody
這個只是必要條件,卻不是設置響應消息類型的方法。
2. 通過HttpServletResponse
1 @RequestMapping(value = { "/api/v1/test" }, method = { RequestMethod.POST }") 2 @ResponseBody 3 public String cancelCall(HttpServletResponse rsp) { 4 rsp.addHeader("Access-Control-Allow-Origin", "*"); 5 rsp.setHeader("Content-Type", "application/json;charset=UTF-8"); 6 return "{\"url\":\"http://192.168.1.1/notify\"}"; 7 }
跟蹤日志,發現對端接收的響應的消息類型仍然是text/plain,這說明Spring重新設置了響應消息頭。
3. 最終的解決辦法
Spring留了一個設置響應消息Content-Type的接口。
在注解@RequestMapping增加一個produces參數項即可。
1 @RequestMapping(value = { "/api/v1/test" }, method = { RequestMethod.POST }, produces="application/json;charset=UTF-8") 2 @ResponseBody 3 public String cancelCall(HttpServletResponse rsp) { 4 rsp.addHeader("Access-Control-Allow-Origin", "*"); 5 return "{\"url\":\"http://192.168.1.1/notify\"}"; 6 }
再跟蹤日志,發現對端收到的響應消息類型是application/json;charset=UTF-8了。