httpClient_3.x版用法

Posted 姩澕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpClient_3.x版用法相关的知识,希望对你有一定的参考价值。

/**
 * 
 */
package me;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.lang3.StringUtils;

/**
 * Created by lzd on 2016年6月27日 上午9:47:36  
 */
public class HttpClient_3x {

    public static void main(String[] args) throws Exception{
//        req();
//        isRedirect();
        loginReq();
    }
    
    //post or get request 
    public static void req() throws Exception{
        HttpClient httpClient = new HttpClient();
        
//        配置代理
//        httpClient.getHostConfiguration().setProxy("127.0.0.1", 80);
        
//        PostMethod postMethod = new PostMethod("http://java.sun.com");
        
        GetMethod getMethod = new GetMethod("http://java.sun.com");
        
        int executeStatus = httpClient.executeMethod(getMethod);
        System.out.println(executeStatus);//成功返回200,应该是响应的状态码
        
//        打印返回的信息
        String responseBodyAsString = getMethod.getResponseBodyAsString();
        System.out.println(responseBodyAsString);

//        释放连接
        getMethod.releaseConnection();
        
    }
    
    //get or post append params
    
    private static GetMethod getGetMethod(){
        return new GetMethod("www.aa.com/a?key = 123");
    }
    
    private static PostMethod getPostMethod(){
    
        PostMethod postMethod = new PostMethod("www.aa.com/a");
        NameValuePair nameValuePair = new NameValuePair("key", "val");
        postMethod.setRequestBody(new NameValuePair[]{nameValuePair});
        return postMethod;
    }
    
//    检测是否重定向
//    301 SC_MOVED_PERMANENTLY 页面已经永久移到另外一个新地址
//    302 SC_MOVED_TEMPORARILY 页面暂时移动到另外一个新的地址
//    303 SC_SEE_OTHER 客户端请求的地址必须通过另外的 URL 来访问
//    307 SC_TEMPORARY_REDIRECT 同 SC_MOVED_TEMPORARILY
    
    public static void isRedirect() throws Exception{
        HttpClient httpClient = new HttpClient();
        GetMethod getMethod = new GetMethod("http://192.168.10.150/pdc/app/book/info/index.html");
        httpClient.executeMethod(getMethod);
        
        getMethod.releaseConnection();
        
        int statusCode = getMethod.getStatusCode();
        
        if(statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY
                || statusCode == HttpStatus.SC_SEE_OTHER 
                || statusCode == HttpStatus.SC_TEMPORARY_REDIRECT){
            Header responseHeader = getMethod.getResponseHeader("location");
            if(responseHeader != null){
                String value = responseHeader.getValue();
                
                if(StringUtils.isNotEmpty(value)){
                    GetMethod method = new GetMethod(value);
                    httpClient.executeMethod(method);
                    //执行之后的操作
                }
            }
        }
    }
    
    /*
     * 模拟登录
     * 首先访问正常页面
     * 拿到返回的结果,判断是否让登录,如果让登录,就登录后再进。
     * 
     * 
     */
    public static void loginReq() throws Exception{
        String targetUrl = "/pdc/app/book/info/index.html";
        
        HttpClient httpClient = new HttpClient();
        httpClient.getHostConfiguration().setHost("192.168.10.150", 80);
        PostMethod postMethod = new PostMethod(targetUrl);
        httpClient.executeMethod(postMethod);
        postMethod.releaseConnection();
        
        int statusCode = postMethod.getStatusCode();
        
        if(statusCode == HttpStatus.SC_MOVED_PERMANENTLY
                || statusCode == HttpStatus.SC_MOVED_TEMPORARILY
                || statusCode == HttpStatus.SC_SEE_OTHER
                || statusCode == HttpStatus.SC_TEMPORARY_REDIRECT){
            Header responseHeader = postMethod.getResponseHeader("location");
            
            if (responseHeader != null){
                String value = responseHeader.getValue();
                System.out.println("redirect location = "+value);
                if(StringUtils.isNotEmpty(value) && value.indexOf("login") != -1){
                    NameValuePair name = new NameValuePair("userName","admin");
                    NameValuePair pwd = new NameValuePair("pwd","admin");
                    
                    PostMethod loginMethod = new PostMethod("/pdc/userLogin.html");
                    loginMethod.setRequestBody(new NameValuePair[]{name,pwd});
                    
                    httpClient.executeMethod(loginMethod);
                    loginMethod.releaseConnection();
                    

                    /**  得到cookie的方法 
                    Cookie[] cookies = httpClient.getState().getCookies();
                    System.out.println("----------------------------cookie start ------------------------------------------");
                    for (Cookie cookie : cookies) {
                        System.out.println(cookie);
                    }
                    System.out.println("----------------------------------------------------------------------");
                    Header[] headerCookies = postMethod.getResponseHeaders("Set-cookie");
                    for (Header header : headerCookies) {
                        System.out.println(header);
                    }
                    System.out.println("----------------------------cookie end------------------------------------------");
                     */
                    
                    GetMethod tarGetMethod = new GetMethod(targetUrl);
                    httpClient.executeMethod(tarGetMethod);
                    System.out.println(tarGetMethod.getResponseBodyAsString());
                    tarGetMethod.releaseConnection();
                }
            } else {
                System.out.println("invalid redirect");
            }
        } else {
            System.out.println(postMethod.getResponseBodyAsString());
        }
    }
    
    //多线程下访问httpclient(同一个站点),只需要在实例化httpclient时传入MultiThreadedHttpConnectionManager即可
    public static void getHttpClient(){
        MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
        
        HttpClient client = new HttpClient(connectionManager);
    }
    
}

//通过http上传文件、提交xml格式数据的例子请看原文地址
//http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html

以上是关于httpClient_3.x版用法的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient使用详解(4.3.X以上版本)

commons.httpclient-3.X.jar 和 httpclient-4.x.jar是个啥关系

HttpClient 和 windows phone 8 便携版

接口-httpClient

HttpClient“任务被取消”

c_cpp 加载源图像固定用法(代码片段,不全)