httpClient使用postMethod请求

(一) maven环境下引入必备jar

<dependency>
    <groupId>commons-httpclientgroupId>
    <artifactId>commons-httpclientartifactId>
    <version>3.1version>
dependency>

(二) 使用httpClient 获取登录的cookie并携带cookie发起请求

//导入的jar包
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.HttpException;

  org.apache.commons.httpclient.HttpClient httpClient = new org.apache.commons.httpclient.HttpClient();
    httpClient.getHostConfiguration().setProxy("localhost",8888);//设置本地代理,方便fiddler监听
    //使用httpClient登录网站,并获取cookie
    PostMethod postMethod = new PostMethod("loginUrl");
    //使用NameValuePair 传递参数
    PostMethod method = new PostMethod("登录后请求的地址"); 
    NameValuePair[] data = { new NameValuePair("key","value") };
    postMethod.setRequestBody(data);

     // 设置 HttpClient 接收 Cookie,用与浏览器一样的策略
    httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);

     // 获取请求的cookie
    Cookie[] cookies = httpClient.getState().getCookies();
    StringBuffer tmpcookies = new StringBuffer();
            for (Cookie c : cookies) {
                tmpcookies.append(c.toString() + ";");
            }
    //携带请求的cookie
     method.setRequestHeader("cookie",tmpcookies.toString());

    //发起请求
    int executeMethod = httpClient.executeMethod(method);

    //获取请求头
    org.apache.commons.httpclient.Header[] headers = method.getResponseHeaders();

    //获取响应,postMethod 提供两种方式,getResponseBodyAsString和getResponseBodyAsStream,但前者在没指定Content-length或者Content-length过长时会报错,推荐使用后者.
    InputStream stream = method.getResponseBodyAsStream();
     BufferedReader br = new BufferedReader(new InputStreamReader(stream));  
         StringBuffer stringBuffer = new StringBuffer(); 
         String str1= "";  
         while((str1 = br.readLine()) !=null){  
         stringBuffer.append(str1);  
         }  
        String sb=stringBuffer.toString();
        //按照utf-8格式输出响应体
        String result = new String(sb.getBytes(),"UTF-8");
        JSONArray fromObject = JSONArray.fromObject(result);
        JSONObject json = fromObject.getJSONObject(0);
        logger.info(result);

(三)使用时遇到的一些坑

  • 使用postMethod访问登陆的url获取的cookie有问题,导致后期通过这个cookie请求数据失效,后来通过fiddler抓包看到了正确的登陆请求地址。fiddler大法好。
  • 在postMethod请求携带cookie信息时候,之前使用如下方式意图携带cookie访问,实测无效。
BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("key","value");
//请求后获取得到的cookie1,由于包不同,不能直接直接执行cookieStore.addCookie(cookie1)
//之前妄图通过BasicClientCookie cookie = new BasicClientCookie(cookie1.getName,cookie1.getValue());来强转换,实测不行。。。
//携带cookie信息还是要通过设置请求头信息来
cookieStore.addCookie(cookie);
httpClient.setCookieStore(cookieStore);        
httpClient.execute("method");
解决发起post请求时候中文乱码问题
//第一种方式        
method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8");//解决中文乱码 

//第二种方式,通过重载getRequestCharSet()方法设置提交的编码(字符集)。 
public class UTF8PostMethod extends PostMethod {
    public UTF8PostMethod(String url){       
        super(url);       
        }       
        @Override       
        public String getRequestCharSet() {       
            //return super.getRequestCharSet();       
            return "UTF-8";       
        }    
}

//两种方式都实测有效。

你可能感兴趣的:(技术随笔)