Java Spring resttemplate字符编码
我使用JavaSpringRESTTemplate通过get请求获取json。我得到的JSON不是特殊字符,而是一些奇怪的东西。所以我猜字符编码有问题。我在网上找不到任何帮助。我现在使用的代码是:Java Spring resttemplate字符编码,java,json,utf-8,character-encoding,resttemplate,Java,Json,Utf 8,Character Encoding,Resttemplate,我使用JavaSpringRESTTemplate通过get请求获取json。我得到的JSON不是特殊字符,而是一些奇怪的东西。所以我猜字符编码有问题。我在网上找不到任何帮助。我现在使用的代码是: String json = restTemplate.getForObject( overPassStatementPostCode, String.class, params); 您只需将StringHttpMessageConverter添加到模板的消息转换器: Rest
String json = restTemplate.getForObject(
overPassStatementPostCode,
String.class,
params);
您只需将
StringHttpMessageConverter
添加到模板的消息转换器:
RestTemplate template = new RestTemplate();
template.getMessageConverters()
.add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
ResponseEntity<Object> response = template.exchange(endpoint, method, entity,
Object.class);
RestTemplate=new RestTemplate();
template.getMessageConverters()
.add(0,新的StringHttpMessageConverter(Charset.forName(“UTF-8”));
ResponseEntity response=template.exchange(端点、方法、实体、,
对象(类);
首先我尝试了@beerbajay的方法,但没有帮助。最后我通过下面的方法解决了这个问题
RestTemplate template = new RestTemplate();
// template.getMessageConverters()
// .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
HttpHeaders headers = new HttpHeaders();
headers.setAccept(newArrayList(MediaType.APPLICATION_JSON));
ResponseEntity<String> response = template.exchange(url, HttpMethod.GET, new HttpEntity<String>(headers), String.class);
RestTemplate=new RestTemplate();
//template.getMessageConverters()
//.add(0,新的StringHttpMessageConverter(Charset.forName(“UTF-8”));
HttpHeaders=新的HttpHeaders();
setAccept(newArrayList(MediaType.APPLICATION_JSON));
ResponseEntity response=template.exchange(url、HttpMethod.GET、新HttpEntity(标题)、String.class);
我对这个案子也有同样的看法,经过一次搜索,我得到了以下链接:
它的解决方法对我很有效:
package com.google.locationlab;
import com.google.common.collect.Lists;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.springframework.http.*;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.List;
public class PortalRestTemplateIntegrationTest {
private Log logger = LogFactory.getLog(PortalRestTemplateIntegrationTest.class);
@Test
public void test() throws Exception {
RestTemplate restTemplate = new RestTemplate();
HttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
List<HttpMessageConverter<?>> httpMessageConverter = Lists.newArrayList();
httpMessageConverter.add(stringHttpMessageConverter);
restTemplate.setMessageConverters(httpMessageConverter);
URI targetUrl= UriComponentsBuilder.fromUriString("http://portal.net")
.path("search")
.queryParam("q", "잠실역")
.build()
.toUri();
HttpHeaders headers = new HttpHeaders();
Charset utf8 = Charset.forName("UTF-8");
MediaType mediaType = new MediaType("text", "html", utf8);
headers.setContentType(mediaType);
headers.set("User-Agent", "mozilla");
headers.set("Accept-Language", "ko");
// gzip 사용하면 byte[] 로 받아서, 압축을 풀고 decoding 해야 한다.
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(targetUrl.toURL().toString(), HttpMethod.GET, entity, String.class);
String result = responseEntity.getBody();
logger.info(result);
}
}
package com.google.locationlab;
导入com.google.common.collect.list;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入org.junit.Test;
导入org.springframework.http.*;
导入org.springframework.http.converter.HttpMessageConverter;
导入org.springframework.http.converter.StringHttpMessageConverter;
导入org.springframework.web.client.rest模板;
导入org.springframework.web.util.UriComponentsBuilder;
导入java.net.URI;
导入java.nio.charset.charset;
导入java.util.List;
公共类PortalRestTemplateIntegrationTest{
私有日志记录器=LogFactory.getLog(PortalRestTemplateIntegrationTest.class);
@试验
public void test()引发异常{
RestTemplate RestTemplate=新RestTemplate();
HttpMessageConverter stringHttpMessageConverter=新的stringHttpMessageConverter(Charset.forName(“UTF-8”);
List我已经解决了这个问题。我需要用UTF-8在请求正文中发布一个字符串对象
文本/纯文本
setContentType(新媒体类型(“文本”、“普通”、标准字符集.UTF_8))
应用程序/json
setContentType(新媒体类型(“applicaton”、“json”、StandardCharsets.UTF_8))
RestTemplate RestTemplate=new RestTemplate();
ResponseEntity ResponseEntity=null;
HttpHeaders HttpHeaders=新的HttpHeaders();
setContentType(新媒体类型(“文本”、“普通”、标准字符集.UTF_8));
HttpEntity HttpEntity=新的HttpEntity(stringContent,httpHeaders);
responseEntity=restemplate.exchange(requestUrl、HttpMethod.POST、httpEntity、String.class);
if(HttpStatus.OK.equals(responseEntity.getStatusCode())){
debug(“…成功…结果:”+responseEntity.getBody());
}
如果可以执行以下操作,您仍然可以使用String.class作为响应类型
升级到SpringWeb5.2解决了这个问题。或者将writeAcceptCharset属性设置为false属于StringHttpMessageConverter,并在RestTemplate实例中进一步使用该转换器
boolean writeAcceptCharSet = false;
List<HttpMessageConverter<?>> c = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> mc : c) {
if (mc instanceof StringHttpMessageConverter) {
StringHttpMessageConverter mcc = (StringHttpMessageConverter) mc;
mcc.setWriteAcceptCharset(writeAcceptCharSet);
}
}
boolean writeAcceptCharSet=false;
列表什么是overPassStatementPostCode?请发布更多代码,包括相应的POJO。您正在设置将使用StringHttpMessageConverter
的String.class
。是否可以尝试使用MappingJackson2HttpMessageConverter
。例如,`ArrayList>();messageConverters.add>(新的MappingJackson2HttpMessageConverter());restTemplate.setMessageConverters(messageConverters);`查看源代码,我们还可以将字符集传递给StringHttpMessageConverter(),您可以传递它UTF-8
charset,因为defaultCharSet是ISO-8859-1
对不起,但我不知道如何在代码中设置字符集。OverpassStatementPostCode只是一个带有占位符的字符串。它会被参数映射中的参数填充。我可以用如下代码创建一个StringMessageConverter:StringHttpMessageConverter stringHttpMessageConverter=新的stringHttpMessageConverter(Charset.forName(“UTF-8”));但我就是找不到一个方法如何在我的http get请求中使用他的转换器。谢谢你的帮助。解决了问题。如果你想要奖金,请在那里写下答案。否则我会链接到这里并写下自己的答案。你的帖子刚刚结束了我两个小时的发帖,谢谢2018年的管理。我只是过来告诉你我爱你解决了我的问题!显然索引很重要。没有0对我来说它就不能工作。@beerbajay:我在使用这种方法时遇到了一个问题。如果我们使用DI(依赖项注入)对于spring中的RestTemplate
,使用这种方法对UTF-8进行编码,然后我们得到在请求过程中遇到的异常:java.util.ConcurrentModificationException
。有没有更好的解决方案!StandardCharsets.UTF\u 8比Charset.forName(“UTF-8”)更好?
boolean writeAcceptCharSet = false;
List<HttpMessageConverter<?>> c = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> mc : c) {
if (mc instanceof StringHttpMessageConverter) {
StringHttpMessageConverter mcc = (StringHttpMessageConverter) mc;
mcc.setWriteAcceptCharset(writeAcceptCharSet);
}
}