Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring resttemplate字符编码_Java_Json_Utf 8_Character Encoding_Resttemplate - Fatal编程技术网

Java Spring resttemplate字符编码

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

我使用JavaSpringRESTTemplate通过get请求获取json。我得到的JSON不是特殊字符,而是一些奇怪的东西。所以我猜字符编码有问题。我在网上找不到任何帮助。我现在使用的代码是:

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);
  }
}