關於httpclient 請求時,出現亂碼問題

在用common-httpclient.jar,實現發生http請求時,出現了瀏覽器時不存在亂碼問題,用代碼實現時出現亂碼問題,根據通常的解決方案就是一句請求報文頭的方法像:java

 method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
可是還會出現亂碼,仔細研究了瀏覽器http的請求,想到設置請求報文頭的編碼是爲了在接入請求那邊取參數這些不會亂碼,返回時也存把內容從字節流轉換爲字符流的問題,也須要編碼,這就須要在服務端返回時要設置返回編輯格式,
若是不設置就會使用默認的ISO-88951,由於服務器不設置也能夠經過在請求時報文頭裏加上指望返回的編碼格式,就是Accept參數
  method.setRequestHeader("Accept", "text/plain;charset=utf-8");




/**
* */ package com.foresee.etax.platform.util; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * <pre> * http 請求工具類 * </pre> * * @author qinyujun qinyujun@foresee.cn * @version 1.00.00 * * <pre> * 修改記錄 * 修改後版本: 修改人: 修改日期: 修改內容: * </pre> */ public class HttpClientUtil { private static Logger logger = LoggerFactory .getLogger(HttpClientUtil.class); public static final String REQUEST_TYPE_POST = "post"; public static final String REQUEST_TYPE_GET = "get"; private static final String DEFAULT_CHARSET = "UTF-8"; public static final String RESPONSE_BODY = "responseBody"; public static final String COOKIES = "cookies"; public static byte[] doPost(String url, Map params) throws Exception{ Map result = doHttpRequest(url, params, REQUEST_TYPE_POST, DEFAULT_CHARSET); return (byte[]) result.get(RESPONSE_BODY); } public static Map doPostWithCookie(String url, Map params) throws Exception{ return doHttpRequest(url, params, REQUEST_TYPE_POST, DEFAULT_CHARSET); } public static Map doHttpRequest(String url, Map<String, String> params, String requestType, String charset) throws Exception { Map resultMap = new HashMap(); HttpClient httpClient = new HttpClient(); //鏈接超時時間 httpClient.getHttpConnectionManager().getParams() .setConnectionTimeout(15000); //讀取超時時間 httpClient.getHttpConnectionManager().getParams().setSoTimeout(30000); PostMethod method = new PostMethod(url); try { method.setRequestBody(mapToNameValuePairs(params)); //設置請求報文頭的編碼 method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); //設置指望返回的報文頭編碼 method.setRequestHeader("Accept", "text/plain;charset=utf-8"); int statusCode = httpClient.executeMethod(method); httpClient.getState().getCookies(); resultMap.put(COOKIES, httpClient.getState().getCookies()); if (statusCode == HttpStatus.SC_OK) { resultMap.put("responseBody", method.getResponseBody()); } else if(statusCode == HttpStatus.SC_MOVED_TEMPORARILY){ Header locationHeader = method.getResponseHeader("location"); String location = locationHeader.getValue(); System.out.println("***redirect location "+location); logger.error("訪問地址被重定向[{}],狀態碼[{}],參數[{}]", new Object[]{url, statusCode, params}); }else{ logger.error("訪問地址失敗[{}],狀態碼[{}],參數[{}]", new Object[]{url, statusCode, params}); } return resultMap; } catch (Exception e) { logger.error("http異常信息[{}][{}]" , url, e.getMessage()); throw e; } finally { method.releaseConnection(); //httpClient.getHttpConnectionManager().closeIdleConnections(0); } } private static NameValuePair[] mapToNameValuePairs(Map params) { if (params == null) { return new NameValuePair[]{}; } NameValuePair[] pairs = new NameValuePair[params.size()]; Set<Entry> entrys = params.entrySet(); int i = 0; for (Entry entry : entrys) { NameValuePair pair = new NameValuePair(); pair.setName((String) entry.getKey()); if (entry.getValue() instanceof String) { pair.setValue((String) entry.getValue()); } else if (entry.getValue() instanceof Number) { pair.setValue(String.valueOf(entry.getValue())); } pairs[i] = pair; i++; } return pairs; } public static String getCookieByName(Cookie[] cookies, String name, String path){ String result = null; if(cookies != null){ for(Cookie cookie : cookies){ if(name.equals(cookie.getName()) && path.equals(cookie.getPath())){ result = cookie.getValue(); break; } } } return result; } public static void main(String[] args) { try { // byte[] result = doPost("http://150.18.31.106/etax/etax_login?username=440100890350562&password=Abcd1234&userType=UP", null); Map<String, String> paramsMap = new HashMap<String, String>(); paramsMap.put("action", "wsInit"); paramsMap.put("gnId", "27A286D62164445AE0536B1F129657F8"); paramsMap.put("ticket", "JnRpbWVzdGFtcD0xNDU5OTA2OTU2MDI2JnVzZXJuYW1lPUo0NDAwMDAxMDA3MDE4NCZ5aGx4PUdSJmRqeGg9MjAxMjQ0MDAxMDAwMDE5ODE3NDQmbnNncm5ibT0yMDEyNDQwMDEwMDAwMTk4MTc0NCZzZnptbGJkbT0yMDImc2Z6bWhtPTEyMzQ1NjcyMzImeG09ZmRzYWtsamwmZ2pkcWRtPTE1Ng"); byte[] result = doPost("http://150.18.31.106/etax/bizfront/nsrwssq.do?action=wsInit&gdslxDm=null&isUseYsqBz=Y&gnId=27A286D62164445AE0536B1F129657F8&gnDm=YHSSB&treeId=27A286D62173445AE0536B1F129657F8&swsxDms=SXA061001007&ticket=JnRpbWVzdGFtcD0xNDU5OTA2OTU2MDI2JnVzZXJuYW1lPUo0NDAwMDAxMDA3MDE4NCZ5aGx4PUdSJmRqeGg9MjAxMjQ0MDAxMDAwMDE5ODE3NDQmbnNncm5ibT0yMDEyNDQwMDEwMDAwMTk4MTc0NCZzZnptbGJkbT0yMDImc2Z6bWhtPTEyMzQ1NjcyMzImeG09ZmRzYWtsamwmZ2pkcWRtPTE1Ng%3D%3D", null); System.out.println(new String(result)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

 

/**
 *
 */
package com.foresee.etax.platform.util;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <pre>
 * http 請求工具類
 * </pre>
 *
 * @author qinyujun qinyujun@foresee.cn
 * @version 1.00.00
 *
 *          <pre>
 * 修改記錄
 *    修改後版本:     修改人:  修改日期:     修改內容:
 * </pre>
 */
public class HttpClientUtil {
    private static Logger logger = LoggerFactory
            .getLogger(HttpClientUtil.class);
    public static final String REQUEST_TYPE_POST = "post";
    public static final String REQUEST_TYPE_GET = "get";
    private static final String DEFAULT_CHARSET = "UTF-8";
    public static final String RESPONSE_BODY = "responseBody";
    public static final String COOKIES = "cookies";
    
    public static byte[] doPost(String url, Map params) throws Exception{
        Map result = doHttpRequest(url, params, REQUEST_TYPE_POST, DEFAULT_CHARSET);
        return (byte[]) result.get(RESPONSE_BODY);
    }
    
    public static Map doPostWithCookie(String url, Map params) throws Exception{
        return doHttpRequest(url, params, REQUEST_TYPE_POST, DEFAULT_CHARSET);
    }
    
    public static Map doHttpRequest(String url, Map<String, String> params,
            String requestType, String charset) throws Exception {
        Map resultMap = new HashMap();
        HttpClient httpClient = new HttpClient();
        //鏈接超時時間
        httpClient.getHttpConnectionManager().getParams()
                .setConnectionTimeout(15000);
        //讀取超時時間
        httpClient.getHttpConnectionManager().getParams().setSoTimeout(30000);

        PostMethod method =  new PostMethod(url);
        try {
            method.setRequestBody(mapToNameValuePairs(params));
//            httpClient.getParams().setContentCharset(DEFAULT_CHARSET);
//            httpClient.getHttpConnectionManager().getParams().setParameter(HttpMethodParams.CREDENTIAL_CHARSET, DEFAULT_CHARSET);
            
//            method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
            method.setRequestHeader("Accept", "text/plain;charset=utf-8");
//            method.addRequestHeader("Content-Type", "text/plain;charset=ISO-8859-1");
            int statusCode = httpClient.executeMethod(method);
            logger.info("http[{}],[{}]", url, statusCode);
            httpClient.getState().getCookies();
            resultMap.put(COOKIES, httpClient.getState().getCookies());
            if (statusCode == HttpStatus.SC_OK) {
                System.out.println("*****"  + new String(method.getResponseBody(),"UTF-8"));
                System.out.println(method.getResponseCharSet()+ "  返回:" + method.getResponseBodyAsString());
                
                resultMap.put("responseBody", method.getResponseBody());
                
            } else if(statusCode == HttpStatus.SC_MOVED_TEMPORARILY){
                Header locationHeader = method.getResponseHeader("location");
                String location = locationHeader.getValue();
                System.out.println("***redirect location "+location);
                logger.error("訪問地址被重定向[{}],狀態碼[{}],參數[{}]", new Object[]{url, statusCode, params});
            }else{
                logger.error("訪問地址失敗[{}],狀態碼[{}],參數[{}]", new Object[]{url, statusCode, params});
            }
            return resultMap;
        } catch (Exception e) {
            logger.error("http異常信息[{}][{}]" , url, e.getMessage());
            throw e;
        } finally {
            method.releaseConnection();
            httpClient.getHttpConnectionManager().closeIdleConnections(0);
        }

    }

    private static NameValuePair[] mapToNameValuePairs(Map params) {
        if (params == null) {
            return new NameValuePair[]{};
        }
        NameValuePair[] pairs = new NameValuePair[params.size()];
        Set<Entry> entrys = params.entrySet();
        int i = 0;
        for (Entry entry : entrys) {
            NameValuePair pair = new NameValuePair();
            pair.setName((String) entry.getKey());
            if (entry.getValue() instanceof String) {
                pair.setValue((String) entry.getValue());
            } else if (entry.getValue() instanceof Number) {
                pair.setValue(String.valueOf(entry.getValue()));
            }
            pairs[i] = pair;
            i++;

        }
        return pairs;
    }
    
    public static String getCookieByName(Cookie[] cookies, String name, String path){
        String result = null;
        if(cookies != null){
            for(Cookie cookie : cookies){
                if(name.equals(cookie.getName()) && path.equals(cookie.getPath())){
                    result = cookie.getValue();
                    break;
                }
            }
            
        }
        return result;
    }
    
    public static void main(String[] args) {
        try {
//            byte[] result = doPost("http://150.18.31.106/etax/etax_login?username=440100890350562&password=Abcd1234&userType=UP", null);
            Map<String, String> paramsMap = new HashMap<String, String>();
            paramsMap.put("action", "wsInit");
            paramsMap.put("gnId", "27A286D62164445AE0536B1F129657F8");
            paramsMap.put("ticket", "JnRpbWVzdGFtcD0xNDU5OTA2OTU2MDI2JnVzZXJuYW1lPUo0NDAwMDAxMDA3MDE4NCZ5aGx4PUdSJmRqeGg9MjAxMjQ0MDAxMDAwMDE5ODE3NDQmbnNncm5ibT0yMDEyNDQwMDEwMDAwMTk4MTc0NCZzZnptbGJkbT0yMDImc2Z6bWhtPTEyMzQ1NjcyMzImeG09ZmRzYWtsamwmZ2pkcWRtPTE1Ng");
            byte[] result = doPost("http://150.18.31.106/etax/bizfront/nsrwssq.do?action=wsInit&gdslxDm=null&isUseYsqBz=Y&gnId=27A286D62164445AE0536B1F129657F8&gnDm=YHSSB&treeId=27A286D62173445AE0536B1F129657F8&swsxDms=SXA061001007&ticket=JnRpbWVzdGFtcD0xNDU5OTA2OTU2MDI2JnVzZXJuYW1lPUo0NDAwMDAxMDA3MDE4NCZ5aGx4PUdSJmRqeGg9MjAxMjQ0MDAxMDAwMDE5ODE3NDQmbnNncm5ibT0yMDEyNDQwMDEwMDAwMTk4MTc0NCZzZnptbGJkbT0yMDImc2Z6bWhtPTEyMzQ1NjcyMzImeG09ZmRzYWtsamwmZ2pkcWRtPTE1Ng%3D%3D", null);
            System.out.println(new String(result));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

apache

相關文章
相關標籤/搜索