我只花了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()函数调用中收到的输出:
在邮递员中收到的具有相同输入和标题的输出:
{"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]
有什么主意我可以解决这个问题吗?感谢所有帮助
答案 0 :(得分:1)
将ResponseEntity的类型从String更改为Object起作用。代码是:
ResponseEntity<Object> entity = restTemplate.exchange(url, HttpMethod.POST, request, Object.class);
感谢@HadiJ向我指出正确的方向。