java中 org.apache.http.impl.client.HttpClientBuilder 通过tddl存数据库中文乱码问题

本文介绍了解决通过Apache HTTP客户端发送POST请求至Elasticsearch和Redis时出现的中文乱码问题。在发送JSON数据前,通过设定StringEntity的编码为UTF-8,确保了中文字符的正确传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:数据通过tddl(tddl:数据库中间件,通过http请求方式,把数据间距存入数据库)存入redis和http请求方式存入es,用到了apache发送请求的jar包,存数据之前,debug模式下,中文没有乱码,是正常编码,存入redis、es后,发现中文乱码,是一串问号。
解决办法:创建请求时,指定StringEntity编码集
代码示例如下:

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

@Component
public class RequestTools {
    private  Logger logger = LoggerFactory.getLogger(RequestTools.class);
    private  String userAgent =  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";
    private  final String DEF_CHATSET = "UTF-8";
    private  final int DEF_CONN_TIMEOUT = 30000;
    private  final int DEF_READ_TIMEOUT = 30000;

    /**
     * 请求es插入数据操作,参数为字符串,post请求
     * @param url
     * @param str json格式的字符串
     * @return 成功:{"_index":"geofencing","_type":"weblocation","_id":"AWhwcUT7RCuwyAS_S4C4",
     * "_version":1,"result":"created","_shards":{"total":1,"successful":1,"failed":0},"created":true}
     */
    public  JSONObject netEsRequestSave(String url,String str){
        CloseableHttpClient httpclient = HttpClientBuilder.create().build();
        HttpPost post = new HttpPost(url);
        post.addHeader("Authorization",getToken());
        JSONObject response = null;
        try {
            String mimeType = "application/json";
             //处理中文乱码问题
            ContentType contentType = ContentType.create(mimeType,"UTF-8");
            StringEntity s = new StringEntity(str,contentType);
            s.setContentEncoding("UTF-8");
            
            //发送json数据需要设置contentType
            s.setContentType("application/json");
            post.setEntity(s);
            HttpResponse res = httpclient.execute(post);
            logger.info("res code:",res.getStatusLine().getStatusCode());
            if(res.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED){
                String result = EntityUtils.toString(res.getEntity());// 返回json格式:
                response = JSONObject.fromObject(result);
                logger.info("es插入数据返回结果:",response);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return response;
    }

 
}

package ins.claim.common.config; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import javax.net.ssl.KeyManager; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; @Configuration public class RestTemplateConfig { private static final int HTTP_CONNECT_TIME_OUT = 10000; @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(HTTP_CONNECT_TIME_OUT); factory.setConnectTimeout(HTTP_CONNECT_TIME_OUT); return factory; } @Bean(name = "restTemplate") public RestTemplate restTemplate() throws Exception { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[0]; } @Override public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { } } }; SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); com.sinosoft.framework.util.ReflectionTools.invokeMethod( sslContext, "init", new Class[]{KeyManager[].class, TrustManager[].class, SecureRandom.class}, new Object[]{null, trustAllCerts, new SecureRandom()} ); SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory( sslContext, NoopHostnameVerifier.INSTANCE ); PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() .setSSLSocketFactory(sslSocketFactory) .build(); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(connectionManager) .build(); HttpComponentsClientHttpRequestFactory customRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); customRequestFactory.setConnectTimeout(HTTP_CONNECT_TIME_OUT); customRequestFactory.setReadTimeout(HTTP_CONNECT_TIME_OUT); RestTemplate restTemplate = new RestTemplate(customRequestFactory); restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; } }
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值