CSDNRGY 2015-11-12 01:38 采纳率: 87.5%
浏览 3374

关于HttpClient的问题,如何使用HttpClient重定向?

 /*
 * HttpRequestProxy.java
 *
 * Created on November 3, 2008, 9:53 AM
 */


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;


public class HttpRequestProxy {
    // 超时间隔
    private static int connectTimeOut = 60000;
    // 让connectionmanager管理httpclientconnection时是否关闭连接
    private static boolean alwaysClose = false;
    // 返回数据编码格式
    private String encoding = "UTF-8";

    private final HttpClient client = new HttpClient();

    public HttpClient getHttpClient() {
        return client;
    }
    /**
     * 用法: HttpRequestProxy hrp = new HttpRequestProxy();
     * hrp.doRequest("http://www.163.com",null,null,"gbk");
     * 
     * @param url
     *            请求的资源URL
     * @param postData
     *            POST请求时form表单封装的数据 没有时传null
     * @param header
     *            request请求时附带的头信息(header) 没有时传null
     * @param encoding
     *            response返回的信息编码格式 没有时传null
     * @return response返回的文本数据
     * @throws CustomException
     */
    public String doRequest(String url, Map postData, Map header, String encoding) throws Exception {
        String responseString = null;
        // 头部请求信息
        Header[] headers = null;
        if (header != null) {
            Set entrySet = header.entrySet();
            int dataLength = entrySet.size();
            headers = new Header[dataLength];
            int i = 0;
            for (Iterator itor = entrySet.iterator(); itor.hasNext();) {
                Map.Entry entry = (Map.Entry) itor.next();
                headers[i++] = new Header(entry.getKey().toString(), entry.getValue().toString());
            }
        }

        // post方式
        if (postData != null) {
            PostMethod postRequest = new PostMethod(url.trim());
            if (headers != null) {
                for (int i = 0; i < headers.length; i++) {
                    postRequest.setRequestHeader(headers[i]);
                }
            }
            Set entrySet = postData.entrySet();
            int dataLength = entrySet.size();
            NameValuePair[] params = new NameValuePair[dataLength];
            int i = 0;
            for (Iterator itor = entrySet.iterator(); itor.hasNext();) {
                Map.Entry entry = (Map.Entry) itor.next();
                params[i++] = new NameValuePair(entry.getKey().toString(), entry.getValue().toString());
            }
            postRequest.setRequestBody(params);
            try {
                responseString = this.executeMethod(postRequest, encoding);
            } catch (Exception e) {
                throw e;
            } finally {
                postRequest.releaseConnection();
            }
        }
        return responseString;
    }

    private String executeMethod(HttpMethod request, String encoding) throws Exception {
        String responseContent = null;
        InputStream responseStream = null;
        BufferedReader rd = null;
        try {
            this.getHttpClient().executeMethod(request);
            if (encoding != null) {
                responseStream = request.getResponseBodyAsStream();
                rd = new BufferedReader(new InputStreamReader(responseStream, encoding));
                String tempLine = rd.readLine();
                StringBuffer tempStr = new StringBuffer();
                String crlf = System.getProperty("line.separator");
                while (tempLine != null) {
                    tempStr.append(tempLine);
                    tempStr.append(crlf);
                    tempLine = rd.readLine();
                }
                responseContent = tempStr.toString();
            } else
                responseContent = request.getResponseBodyAsString();

            Header locationHeader = request.getResponseHeader("location");
            // 返回代码为302,301时,表示页面己经重定向,则重新请求location的url,这在
            // 一些登录授权取cookie时很重要
            if (locationHeader != null) {
                String redirectUrl = locationHeader.getValue();
                this.doRequest(redirectUrl, null, null, null);
            }
        } catch (HttpException e) {
            throw new Exception(e.getMessage());
        } catch (IOException e) {
            throw new Exception(e.getMessage());

        } finally {
            if (rd != null)
                try {
                    rd.close();
                } catch (IOException e) {
                    throw new Exception(e.getMessage());
                }
            if (responseStream != null)
                try {
                    responseStream.close();
                } catch (IOException e) {
                    throw new Exception(e.getMessage());

                }
        }
        return responseContent;
    }

    /**
     * 特殊请求数据,这样的请求往往会出现redirect本身而出现递归死循环重定向 所以单独写成一个请求方法
     * 比如现在请求的url为:http://localhost:8080/demo/index.jsp 返回代码为302
     * 头部信息中location值为:http://localhost:8083/demo/index.jsp
     * 这时httpclient认为进入递归死循环重定向,抛出CircularRedirectException异常
     * 
     * @param url
     * @return
     * @throws CustomException
     */
    public String doSpecialRequest(String url, int count, String encoding) throws Exception {
        String str = null;
        InputStream responseStream = null;
        BufferedReader rd = null;
        GetMethod getRequest = new GetMethod(url);
        // 关闭httpclient自动重定向动能
        getRequest.setFollowRedirects(false);
        try {

            this.client.executeMethod(getRequest);
            Header header = getRequest.getResponseHeader("location");
            if (header != null) {
                // 请求重定向后的URL,count同时加1
                this.doSpecialRequest(header.getValue(), count + 1, encoding);
            }
            // 这里用count作为标志位,当count为0时才返回请求的URL文本,
            // 这样就可以忽略所有的递归重定向时返回文本流操作,提高性能
            if (count == 0) {
                getRequest = new GetMethod(url);
                getRequest.setFollowRedirects(false);
                this.client.executeMethod(getRequest);
                responseStream = getRequest.getResponseBodyAsStream();
                rd = new BufferedReader(new InputStreamReader(responseStream, encoding));
                String tempLine = rd.readLine();
                StringBuffer tempStr = new StringBuffer();
                String crlf = System.getProperty("line.separator");
                while (tempLine != null) {
                    tempStr.append(tempLine);
                    tempStr.append(crlf);
                    tempLine = rd.readLine();
                }
                str = tempStr.toString();
            }

        } catch (HttpException e) {
            throw new Exception(e.getMessage());
        } catch (IOException e) {
            throw new Exception(e.getMessage());
        } finally {
            getRequest.releaseConnection();
            if (rd != null)
                try {
                    rd.close();
                } catch (IOException e) {
                    throw new Exception(e.getMessage());
                }
            if (responseStream != null)
                try {
                    responseStream.close();
                } catch (IOException e) {
                    throw new Exception(e.getMessage());
                }
        }
        return str;
    }

    public static void main(String[] args) throws Exception {

        HttpRequestProxy hrp = new HttpRequestProxy();
        Map date = new HashMap();
        date.put("jyidApplet", "1");
        date.put("codeNumApplet", "1");
        date.put("jymxIdApplet", "447");
        date.put("patientIdApplet", "1118");
        String str = hrp.doRequest("http://127.0.0.1:8080/lis/mz/addTM",date, null, null);
        System.out.println(str);

    }

}

  • 写回答

1条回答

  • CSDNRGY 2015-11-12 01:45
    关注

    executeMethod()方法中的Header locationHeader = request.getResponseHeader("location");
    我把location填写成了我要重定向的地址 http://192.168.1.122:8080/lis/mz/Mzquerypaging.action,但是不好使,哪位大神用过这个东西

    评论

报告相同问题?

悬赏问题

  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决