java的HttpClient请求,返回的数据部分乱码,请大侠指点呀!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的HttpClient请求,返回的数据部分乱码,请大侠指点呀!相关的知识,希望对你有一定的参考价值。

HttpClient httpClient = new HttpClient();
StringBuilder result = new StringBuilder();
InputStream ins = null;

GetMethod method = new GetMethod(url);
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));

try

int statusCode = httpClient.executeMethod(method);
if (statusCode == HttpStatus.SC_OK)

ins = method.getResponseBodyAsStream();
byte[] b = new byte[1024];
int r_len = 0;
while ((r_len = ins.read(b)) > 0)

result.append(new String(b, 0, r_len, method.getResponseCharSet()));

else

System.err.println("Response Code: " + statusCode);

catch (HttpException e)

System.err.println("Fatal protocol violation: " + e.getMessage());

可以把你的这段代码简化一下

 ins = method.getResponseBodyAsStream();
 byte[] b = new byte[1024];
 int r_len = 0;
 while ((r_len = ins.read(b)) > 0)
  
       result.append(new String(b, 0, r_len, method.getResponseCharSet()));
  

替换为:

byte[] ba = method.getResponseBody();
String str= new String(ba,"UTF-8"); //得到指定编码格式的字符串

这里的str就是你的返回值。这段代码我使用过,可以解决乱码问题

参考技术A 编码转换一下

使用HttpClient实现对第三方服务器的请求并接受返回数据

/*
 * 创建日期 2017-5-24
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package com.enfo.intrust.command;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.*;
import net.sf.json.JSONObject;
import java.util.Properties;
import java.io.IOException;

/**
 * @author tapt
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */

public class BankCommandService {
    private static String rootURL="";//银企直联平台服务器地址
    private static Properties commandProperties=new Properties();
    //读取银企直联平台配置文件的属性
    static{
        try {
            commandProperties.load(BankCommandService.class.getResourceAsStream("BankCommand.properties"));
            rootURL=commandProperties.getProperty("rootURL");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * @TODO 通用方法,传入一个json,连接银企直联平台,返回平台响应的json
     * */
    public String sendCommand(String commandURL,String sendJson){
        String resultJson="银企直连平台返回异常";
        try {      
            // 新建HttpClient对象,用于访问银企直联平台;
            HttpClient httpClient = new HttpClient();
            PostMethod postMethod = new PostMethod(commandURL);
            // 让post请求携带json数据
            RequestEntity requestEntity = new StringRequestEntity(sendJson,"application/json", "UTF-8");
            postMethod.setRequestEntity(requestEntity);
            // 发送post请求
            httpClient.executeMethod(postMethod);
            // 得到从银企直联响应的json数据
           resultJson = new String(postMethod.getResponseBody());
        } catch (Exception e) {
            e.printStackTrace();
        }                
        return resultJson;
    }
    
    /**
     * @TODO 直接划款
     * */
    public String directPay(String sendJson){
        String commandURL=rootURL+commandProperties.getProperty("directPayCommand");
        return sendCommand(commandURL,sendJson);
        }
    
    /**
     * @TODO 批量查询余额
     * */
    public String getBalanceBatch(String sendJson){
        String commandURL=rootURL+commandProperties.getProperty("getBalanceBatchCommand");
        return sendCommand(commandURL,sendJson);
        }
    
    /**
     * @TODO 查询账户列表
     * */    
    public String getAccountList(String sendJson){
        String commandURL=rootURL+commandProperties.getProperty("getAccountListCommand");
        return sendCommand(commandURL,sendJson);
        }
    
    /**
     * @TODO 用于测试银企直联返回数据的方法-查询所有账户列表
     * */
    public static void main(String[] args) {
            JSONObject jsonObject = new JSONObject();
            JSONObject headvalue=new JSONObject();
            JSONObject bodyvalue=new JSONObject();
            JSONObject infovalue=new JSONObject();
            headvalue.put("request_no", "001201612221707000002");
            headvalue.put("device_type", "1");
            headvalue.put("cust_id", "1122345452");
            headvalue.put("router", "1");
            headvalue.put("channel", "01");
            headvalue.put("app_id", "0001");
            headvalue.put("charset", "UTF-8");
            headvalue.put("version", "1.0.0.1");
            headvalue.put("sign", "MScRd7GM52W41VpRGxn7BtNWsSLM/RZPzbIGjxQFiChQcN8CXTjFU9MVtDP7NXxgZZddVc+NOc+P91anV9fQ1TjtdYZJr5hg1xPP/CAokB5LlxANnc+UfBcGQWGRGjXa/wijRPvdu7hiHEKW4dNt6giQgQMlcH/1eobXY5Z4pmU=");
            headvalue.put("language", "CN");
            
            jsonObject.put("head", headvalue);
            
            infovalue.put("buscod", "n03010");
            infovalue.put("busmod", "00001");
            
            bodyvalue.put("info", infovalue);
            
            jsonObject.put("body", bodyvalue);
          //创建查询账户列表的发送json
            System.out.println("要传入到银企直联的json数据是:\n"+jsonObject.toString());
            System.out.println("从银企直联平台查询账号列表,接收到的响应是:");
            //调用业务逻辑方法,取得返回的json并打印
           String resultString=new BankCommandService().getAccountList(jsonObject.toString());
           System.out.println(resultString);       
    }
}

以上是关于java的HttpClient请求,返回的数据部分乱码,请大侠指点呀!的主要内容,如果未能解决你的问题,请参考以下文章

使用HttpClient实现对第三方服务器的请求并接受返回数据

使用HttpClient实现对第三方服务器的请求并接受返回数据

java httpclient请求为excel导出,从中如何提取数据

Java通过httpClient同步异步发送请求

httpclient的post请求超时

httpclient请求啥状况200状态下返回的response的数据为空