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


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

 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.powerjun.xxxxx.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@powerjun.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 { Map<String, String> paramsMap = new HashMap<String, String>(); paramsMap.put("action", "xxxxx"); paramsMap.put("gnId", "xxxxxx"); paramsMap.put("ticket", "xxxxxxxx"); byte[] result = doPost("http://xxxxxxx.do", null); System.out.println(new String(result)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM