一个国家专利查询demo

写了一下午,借鉴apache的 httpclient 源码 调用 写的,拿出来分享一下,可以用作其他不同平台的项目post/get数据上面。

package cn.shb.test;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

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;

/**
 * Created by caozengling on 2016/9/27.
 */
public class ZhuanLiSearch {
    //超时间隔
    private static int connectTimeOut = 60000;
    //让connectionmanager管理httpclientconnection时是否关闭连接
    public static boolean alwaysClose = false;
    //返回数据编码格式
    private String encoding = "UTF-8";

    private final HttpClient client = new HttpClient(new SimpleHttpConnectionManager());

    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) {

            } finally {
                postRequest.releaseConnection();
            }
        }
        //get方式
        if (postData == null) {
            GetMethod getRequest = new GetMethod(url.trim());
            if (headers != null) {
                for (int i = 0; i < headers.length; i++) {
                    getRequest.setRequestHeader(headers[i]);
                }
            }
            try {
                responseString = this.executeMethod(getRequest, encoding);
            } catch (Exception e) {

            } finally {
                getRequest.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) {

        } catch (IOException e) {


        } finally {
            if (rd != null)
                try {
                    rd.close();
                } catch (IOException e) {

                }
            if (responseStream != null)
                try {
                    responseStream.close();
                } catch (IOException e) {


                }
        }
        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) {

        } catch (IOException e) {

        } finally {
            getRequest.releaseConnection();
            if (rd != null)
                try {
                    rd.close();
                } catch (IOException e) {

                }
            if (responseStream != null)
                try {
                    responseStream.close();
                } catch (IOException e) {

                }
        }
        return str;
    }


    public static void main(String[] args) throws Exception {
        ZhuanLiSearch  hrp = new ZhuanLiSearch ();
        Map header = new HashMap();
        header.put("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 1.7; .NET CLR 1.1.4322; CIBA; .NET CLR 2.0.50727)");

        Map params = new HashMap();

        params.put("wd", "zhang");
        StringBuffer sb = new StringBuffer();
        sb.append("23200820137723.6");
        String str = hrp.doRequest(
                "http://www.soopat.com/Home/Result?SearchWord=" +
                        sb,
                null, header, null);
        System.out.println(str);
        if (str.indexOf("NotFoundContent")!=-1){
            System.out.println("1");
        }else {
            System.out.println("2");
        }
//        System.out.println(str.contains("</title>"));
//  System.out.println(str);
    }

}

  

原文地址:https://www.cnblogs.com/caozengling/p/5913450.html