HttpUtil http请求工具,调用第三方接口

时间:2024-03-07 08:58:03
package cn.com.prac.util;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

import cn.com.prac.util.HttpUtil.ReqData.ReqType;
import cn.com.prac.util.HttpUtil.RespData.RespType;

import com.alibaba.fastjson.JSON;
/**
 * http请求工具(调用第三方接口)
 *
 */
public final class HttpUtil {

    private final static int REQ_EX_CODE = -99 ;
    private final static int TIME_OUT = 10 * 10000000; // 超时时间 
    
    private HttpUtil(){} 
    
    
    public static RespData reqConnection(ReqData reqData){
        URL url = null ;
        BufferedWriter out = null ;
        BufferedReader reader = null ;
        HttpURLConnection urlConnection = null ;
        RespData respData = null ;
        try {
            //设置请求参数
            StringBuilder arg = null ;
            String para = "" ;
            Map<String,Object> parameter = reqData.getParameter() ;
            if(null != parameter && !parameter.isEmpty()){
                arg = new StringBuilder() ;
                for(Map.Entry<String,Object> entry : parameter.entrySet()){
                    arg.append(entry.getKey()).append("=").append(entry.getValue()).append("&") ;
                }
                para = "?" + arg.substring(0,arg.length()-1) ;
            }
            url = new URL(reqData.getUrl() + para) ;
            urlConnection = (HttpURLConnection) url.openConnection() ;
            urlConnection.setDoInput(true) ;
            urlConnection.setDoOutput(true) ;
            if(0 != reqData.getTimeOut()){
                urlConnection.setReadTimeout(reqData.getTimeOut()) ;
                urlConnection.setConnectTimeout(reqData.getTimeOut()) ;
            }
            urlConnection.setRequestMethod(reqData.getMethod().toUpperCase()) ;
            urlConnection.setRequestProperty("Content-Type",reqData.getContentType()) ;
            //设置请求头
            Map<String,String> hMap = reqData.getHeader() ;
            if(null != hMap && !hMap.isEmpty()){
                for(Map.Entry<String,String> entry : hMap.entrySet()){
                    urlConnection.setRequestProperty(entry.getKey(),entry.getValue()) ;
                }
            }
            urlConnection.connect() ;
            if(ReqType.POST.get().equals(reqData.getMethod()) || ReqType.PUT.get().equals(reqData.getMethod())){
                out = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream(),Charset.forName("utf-8"))) ;
            }
            //设置请求内容(json字符串的请求)
            String content = reqData.getReqContent() ;
            if(!isEmpty(content)){
                if(null == out){
                    out = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream(),Charset.forName("utf-8"))) ;
                }
                out.write(content) ;
                out.flush() ;
            }
            respData = getRespData(reader,urlConnection) ;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            respData = createRespData(REQ_EX_CODE,"URL不正确。") ;
        } catch (ProtocolException e) {
            e.printStackTrace();
            respData = createRespData(REQ_EX_CODE,"协议不正确。") ;
        } catch (IOException e) {
            e.printStackTrace();
            respData = createRespData(REQ_EX_CODE,"数据流读写失败。") ;
        } finally {
            close(out) ;
            close(reader) ;
            if(null != urlConnection){
                urlConnection.disconnect() ;
                urlConnection = null ;
            }
        }
        return respData ;
    }
    
    private static RespData getRespData(BufferedReader reader,HttpURLConnection urlConnection) throws IOException{
        RespData respData = null ;
        int code = urlConnection.getResponseCode() ;
        switch (code) {
        case 200:
            reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),Charset.forName("utf-8"))) ;
            String data = null ;
            StringBuilder result = new StringBuilder() ;
            while(null !=(data = reader.readLine())){
                result.append(data) ;
            }
            String resultStr = result.toString() ;
            try {
                respData = createRespData(JSON.parse(resultStr)) ;
            } catch (Exception e) {
                //返回string:可能是html,xml...
                respData = createRespData(200,RespType.STRING,resultStr) ;
            }
            result.delete(0,result.length()) ;
            result = null ;
            break;
        case 302:
            respData = createRespData(302,"编码302:请求定向失败。") ;
            break;
        case 400:
            respData = createRespData(400,"编码400:请求出现语法错误。") ;
            break;
        case 403:
            respData = createRespData(403,"编码403:资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。") ;
            break;
        case 404:
            respData = createRespData(404,"编码404:无法找到指定位置的资源。") ;
            break;
        case 405:
            respData = createRespData(405,"编码405:请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。") ;
            break;
        case 500:
            respData = createRespData(500,"编码500:服务器遇到了意料不到的情况,不能完成客户的请求。") ;
            break;
        default:
            respData = createRespData(code,"请求发生错误,错误编码:" + code) ;
            break ;
        }
        return respData ;
    }
    
    /**
     * 获取请求参数
     * @return
     */
    public static ReqData createReq(){
        return createReq(null,null) ;
    }
    /**
     * 获取请求参数
     * @param header 请求头
     * @return
     */
    public static ReqData createReq(Map<String,String> header){
        return createReq(header,null) ;
    }
    /**
     * 获取请求参数
     * @param header 请求头
     * @param parameter 请求参数
     * @return
     */
    public static ReqData createReq(Map<String,String> header,Map<String,Object> parameter){
        return ReqData.create(header,parameter) ;
    }
    
    /**
     * 
     * @param data 返回的数据结果
     * @return
     */
    private static RespData createRespData(Object data){
        return createRespData(200,data) ;
    }
    /**
     * 
     * @param code Http返回的状态
     * @param data 请求返回的数据结果
     * @return
     */
    private static RespData createRespData(int code,Object data){
        return RespData.create(code, data) ;
    }
    
    private static RespData createRespData(int code,RespType respType,Object data){
        return RespData.create(code,respType,data) ;
    }
    
    /**
     * 网络请求对象
     */
    public static class ReqData {
        
        private ReqData(){}
        /**
         * 请求的url
         */
        private String url ;
        /**
         * 请求的方式:默认为GET
         */
        private String method = ReqType.POST.get() ;
        /**
         * 数据请求类型:默认为application/x-www-form-urlencoded
         */
        private String contentType = "application/x-www-form-urlencoded" ;
        /**
         * 数据请求内容:json字符串
         */
        private String reqContent ;
        /**
         * 超时时间设置(单位:毫秒)
         */
        private int timeOut ;
        /**
         * 请求参数信息
         */
        private Map<String,Object> parameter ;
        /**
         * 请求头信息
         */
        private Map<String,String> header ;
        
        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public String getMethod() {
            return method;
        }

        public void setMethod(String method) {
            this.method = method;
        }

        public String getContentType() {
            return contentType;
        }

        public void setContentType(String contentType) {
            this.contentType = contentType;
        }

        public Map<String, Object> getParameter() {
            return parameter ;
        }

        public Map<String, String> getHeader() {
            return header;
        }

        public int getTimeOut() {
            return timeOut;
        }

        public void setTimeOut(int timeOut) {
            this.timeOut = timeOut;
        }
        
        public String getReqContent() {
            return reqContent;
        }

        public void setReqContent(String reqContent) {
            this.reqContent = reqContent;
        }

        public ReqData addReqProperty(String key,String value){
            if(null == this.header){
                this.header = new HashMap<String,String>() ;
            }
            this.header.put(key,value) ;
            return this ;
        }
        
        public ReqData addReqParameter(String key,Object value){
            if(null == this.parameter){
                this.parameter = new HashMap<String,Object>() ;
            }
            this.parameter.put(key,value) ;
            return this ;
        }
        
        public static ReqData create(){
            ReqData reqData = new ReqData() ;
            return reqData ;
        }
        
        public static ReqData create(Map<String,String> header){
            ReqData reqData = create() ;
            if(null != header && !header.isEmpty()){
                reqData.header = header ;
            }
            return reqData ;
        }
        
        public static ReqData create(Map<String,String> header,Map<String,Object> parameter){
            ReqData reqData = create(header) ;
            if(null != parameter && !parameter.isEmpty()){
                reqData.parameter = parameter ;
            }
            return reqData ;
        }
        
        public static enum ReqType{
            GET("GET") ,POST("POST") ,PUT("PUT") ,DELETE("DELETE") ;
            
            private String type ;
            
            private ReqType() {
            }
            
            private ReqType(String type){
                this.type = type ;
            }
            
            public String get(){
                return this.type ;
            }
        }
    }
    /**
     * 请求返回对象
     */
    public static class RespData{
        /**
         * 请求返回的编码
         */
        private int code ;
        /**
         * 返回类型:json,string...
         */
        private RespType type ;
        /**
         * 请求返回的数据结果
         */
        private Object data ;
        
        private RespData() {}
        
        public int getCode() {
            return code;
        }

        public void setCode(int code) {
            this.code = code;
        }

        public Object getData() {
            return data;
        }

        public void setData(Object data) {
            this.data = data;
        }
        
        public RespType getType() {
            return type;
        }

        public void setType(RespType type) {
            this.type = type;
        }

        public static RespData create(){
            return create(200,null) ;
        }
        
        public static RespData create(Object data){
            return create(200,data) ;
        }
        
        public static RespData create(int code,Object data){
            RespData respData = new RespData() ;
            respData.setCode(code) ;
            respData.setData(data) ;
            respData.setType(RespType.JSON) ;
            return respData ;
        }
        public static RespData create(int code,RespType respType,Object data){
            RespData respData = new RespData() ;
            respData.setCode(code) ;
            respData.setData(data) ;
            respData.setType(respType) ;
            return respData ;
        }
        
        public static enum RespType{
            JSON ,STRING ;
            
            private String type ;
            
            private RespType() {}
            
            private RespType(String type){
                this.type = type ;
            }
            
            public String get(){
                return this.type ;
            }
        }
    }
    
    private static boolean isEmpty(String str){
        return null == str || "".equals(str.trim()) || "null".equals(str.trim()) ;
    }
    
    private static void close(Closeable stream){
        try {
            if(null != stream){
                stream.close() ;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        stream = null ;
    }
    
    public static void main(String[] args) {
        
        /**********无参数和无请求头的情况*******************/
        /*//创建请求对象
        ReqData reqData = HttpUtil.createReq() ;
        //请求方式
        reqData.setMethod("POST") ;
        //数据请求类型
        reqData.setContentType("Application/json") ;
        //请求地址
        reqData.setUrl("http://wx.cqzfj.com/xmy-b2b-app-web/index?v=1.0") ;
        //调用接口
        RespData respData = HttpUtil.reqConnection(reqData) ;
        //获得返回的json字符串
        String result = JSON.toJSONString(respData) ;
        System.out.println("获得的json:" + result) ;*/
        
        /**********带参数和请求头的情况*******************/
        //创建请求对象
        ReqData reqData = HttpUtil.createReq() ;
        //请求方式
        reqData.setMethod("POST") ;
        //数据请求类型
        reqData.setContentType("application/json") ;
        //参数
        reqData.addReqParameter("status",-1) ;
        reqData.addReqParameter("v","1.0") ;
        //添加header请求头信息
        reqData.addReqProperty("token","A74DF5F691C24A158A50A2D880284665") ;
        //请求地址
        reqData.setUrl("http://****.com/list") ;
        //调用接口
        RespData respData = HttpUtil.reqConnection(reqData) ;
        //获得返回的json字符串
        String result = JSON.toJSONString(respData) ;
        System.out.println("获得的json:" + result) ;
        
        /***********也可以通过这种方式传header**************/
        /*Map<String,String> header = new HashMap<String,String>() ;
        header.put("token", "A74DF5F691C24A158A50A2D880284665") ;
        ReqData reqData = HttpUtil.createReq(header) ;*/
    }
    
}