Spring Framework 3.2.5-解码POST API输出的响应正文

时间:2018-10-15 16:14:19

标签: java spring java-8 spring-3 spring-web

我只花了5个小时来尝试解决此问题,但我取得了零进展。我已经尝试了所有可以找到的解决方案,但是遇到了麻烦。

这是我的基本设置和面临的问题:

基本设置

我有2个功能-

1)callGetApi(字符串网址)

2)callPostApi(字符串url,字符串requestBody)

代码大致相同:

callGetApi:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Content-Type", "application/json");
headers.add("Authorization", "Basic " + apiAuthorizationString);
ResponseEntity<String> entity = null;
try {

    entity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Object>(headers), String.class);
    apiOutput = gson.fromJson(entity.getBody().toString(), ApiOutput.class);
}
....

callPostApi:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Content-Type", "application/json");
headers.add("Authorization", "Basic " + apiAuthorizationString);
HttpEntity<Object> request = new HttpEntity<Object>(request_body, headers);
ResponseEntity<String> entity = null;
try {

     entity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
     apiOutput = gson.fromJson(entity.getBody().toString(), ApiOutput.class);
    }
.....

问题

我面临的问题是,在callGetApi()函数中,我收到正确的响应,该响应已正确解码,但是在CallPostApi()函数中,我收到了不同编码的响应无法解码。两者在相同输入下,在PostMan中都可以正常工作。

我在callPostApi()函数调用中收到的输出:

Debugger Output

在邮递员中收到的具有相同输入和标题的输出:

{"SuccessData":"Ticket not saved as no changes madeINC024","ErrorData":null,"AppData":null}

在callGetApi()函数中,我总是收到以下标头:

{Transfer-Encoding=[chunked], Content-Type=[text/plain; charset=utf-8], Server=[Kestrel], X-Powered-By=[ASP.NET], Date=[Mon, 15 Oct 2018 13:05:27 GMT]}

在callPostApi()函数中,我总是收到以下标头:

 {Transfer-Encoding=[chunked], Content-Type=[text/plain; charset=utf-16], Server=[Kestrel], X-Powered-By=[ASP.NET], Date=[Mon, 15 Oct 2018 13:06:58 GMT]}

同时,用于callPostApi()函数的相同API端点正在Postman中发送正确的标头(与上述callGetApi()的标头相同)

我尝试过的解决方案:

我已经尝试了以下所有PnC:

1)分别和一起为UTF-16和UTF-8添加了StringHttpMessageConverter:

restTemplate.getMessageConverters().add(0, new  StringHttpMessageConverter(Charset.forName("UTF-16")));

2)删除了所有其他转换器:

restTemplate.getMessageConverters().clear();

3)在callPostApi()中添加了以下标头:

headers.add("Accept-Encoding", "identity");
headers.add("Cache-Control", "no-cache");
headers.add("Accept-Charset", "utf-8");
headers.add("Accept", "application/json, charset=utf-8");
headers.set("Accept-Language", "en");

4)使用HttpHeaders代替MultiValueMap:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Authorization", "Basic " + apiAuthorizationString);
headers.add("Accept-Encoding", "identity");
headers.add("Cache-Control", "no-cache");
headers.add("Accept-Charset", "utf-8");

我尝试过的东西显示出一些进步:

entity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
//entity has the same data as the debugger screenshot I've attached above
byte[] utf8 = entity.getBody().toString().getBytes("UTF-16");
String string = new String(utf8, "UTF-8");

运行上面的代码时,字符串数组包含正确的输出BUT,且所有字符之间都有空格:

  

[{,,“ ,, S ,, u ,, c ,, c ,, e ,, s ,, s ,, D ,, a,t,a ,,” ,,:,“ ,,票,,   ,, n ,, o ,, t ,,,, s ,, a ,, v ,, e ,, d ,,,, a ,, s ,,,,, n ,, o ,,   ,,变化,,   ,, m ,, a ,, d ,, e,I,N,C,0,,2,,4,“ ,,,,,,” ,, E ,, r ,, r ,, o ,, r ,, D,a,t,a,“,” ,,, n ,, u,l,l,l ,,,,,“ ,, ,D ,, a ,, t ,, a ,,“ ,,:,, n ,, u ,, l ,, l ,,},]

字节数组包含以下数据:

  

[123,0,34,0,83,0,117,0,99,0,99,0,101,0,115,0,115,0,   68、0、97、0、116、0、97、0、34、0、58、0、34、0、84、0、105、0、99,   0、107、0、101、0、116、0、32、0、110、0、111、0、116、0、32、0、115,   0、97、0、118、0、101、0、100、0、32、0、97、0、115、0、32、0、110、0,   111、0、32、0、99、0、104、0、97、0、110、0、103、0、101、0、115、0,   32、0、109、0、97、0、100、0、101、0、73、0、78、0、67、0、48、0、50,   0、52、0、34、0、44、0、34、0、69、0、114、0、114、0、111、0、114、0,   68、0、97、0、116、0、97、0、34、0、58、0、110、0、117、0、108、0,   108、0、44、0、34、0、65、0、112、0、112、0、68、0、97、0、116、0、97,   0、34、0、58、0、110、0、117、0、108、0、108、0、125、0]

有什么主意我可以解决这个问题吗?感谢所有帮助

1 个答案:

答案 0 :(得分:1)

将ResponseEntity的类型从String更改为Object起作用。代码是:

ResponseEntity<Object> entity = restTemplate.exchange(url, HttpMethod.POST, request, Object.class);

感谢@HadiJ向我指出正确的方向。