天天看點

Spring整合Apache HttpClient實作RESTful風格接口調用一、配置檔案的編輯寫二、工具類的編寫(三)測試

一、配置檔案的編輯寫

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <context:component-scan base-package="com.brillilab.httpclient"/>

    <context:property-placeholder location="classpath:properties/httpclient.properties"/>

    <!-- 連接配接管理器 -->
    <bean id="httpClientConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
        <property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}"/>
        <property name="maxTotal" value="${http.maxTotal}"/>
    </bean>

    <!-- HttpClientBuilder HttpClient建構器 -->
    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
        <property name="connectionManager" ref="httpClientConnectionManager"/>
    </bean>

    <!-- HttpClient對象 由HttpClientBuilder生産 -->
    <bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient" factory-bean="httpClientBuilder" factory-method="build" scope="prototype"/>

    <!-- RequestConfig.Builder RequestConfig建構器 -->
    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
        <property name="connectTimeout" value="${http.connectTimeout}"/>
        <property name="connectionRequestTimeout" value="${http.connectionRequestTimeout}"/>
        <property name="socketTimeout" value="${http.socketTimeout}"/>
        <property name="staleConnectionCheckEnabled" value="${http.staleConnectionCheckEnabled}"/>
    </bean>

    <!-- RequestConfig對象 -->
    <bean id="requestConfig" class="org.apache.http.client.config.RequestConfig" factory-bean="requestConfigBuilder" factory-method="build"/>
</beans>
           

二、工具類的編寫

(一)HttpClientUtils

package com.brillilab.httpclient;

import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.SerializableEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.Serializable;
import java.util.Map;

/**
 * HttpClient工具類
 *
 * @author wmh
 */
@Component
public class HttpClientUtils {

    private static final String UTF8="utf-8";

    private static CloseableHttpClient httpClient;

    private static RequestConfig requestConfig;

    public static String sendHttp(HttpRequestMethodEnum requestMethod, String url, Map<String,Serializable> params, Map<String,String> header){

        HttpRequestBase request = requestMethod.createRequest(url);
        request.setConfig(requestConfig);

        CloseableHttpResponse httpResponse = null;
        String responseContent = null;

        //添加請求頭
        if (header!=null){
            for (Map.Entry<String,String> entry:header.entrySet()){
                request.setHeader(entry.getKey(),entry.getValue());
            }
        }

        //添加請求參數
        try {
            if (params!=null){
                for (Map.Entry<String,Serializable> entry:params.entrySet()){
                    ((HttpEntityEnclosingRequest)request).setEntity(new SerializableEntity(entry.getValue(),true));
                }
            }
            //執行HTTP請求
            httpResponse=httpClient.execute(request);
            //擷取響應對象實體
            HttpEntity entity = httpResponse.getEntity();
            //從響應對實體中擷取響應的内容
            if (entity!=null){
                responseContent=EntityUtils.toString(entity,UTF8);
            }
        }catch (IOException e){
            e.printStackTrace();;
        }finally {
            try {
                //關閉響應對象;
                if (httpResponse != null) {
                    httpResponse.close();
                }
                //關閉HttpClient.
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return responseContent;
    }

    @Resource(name = "httpClient")
    public void setHttpClient(CloseableHttpClient httpClient) {
        this.httpClient = httpClient;
    }

    @Resource(name = "requestConfig")
    public void setRequestConfig(RequestConfig requestConfig) {
        this.requestConfig = requestConfig;
    }
}
           

(二)HttpRequestMethodEnum

package com.brillilab.httpclient;

import org.apache.http.client.methods.*;

/**
 * HttpRequestMethodEnum
 *
 * @author wmh
 */
public enum HttpRequestMethodEnum {
    //HttpGet
    HttpGet{
        @Override
        public HttpRequestBase createRequest(String url) {
            return new HttpGet(url);
        }
    },
    //HttpPost
    HttpPost{
        @Override
        public HttpRequestBase createRequest(String url) {
            return new HttpPost(url);
        }
    },
    //HttpPut
    HttpPut{
        @Override
        public HttpRequestBase createRequest(String url) {
            return new HttpPut(url);
        }
    },
    //HttpDelete
    HttpDelete{
        @Override
        public HttpRequestBase createRequest(String url) {
            return new HttpDelete(url);
        }
    }
    ;

    public abstract HttpRequestBase createRequest(String url);
}
           

(三)測試

package com.brillilab.test;

import com.brillilab.httpclient.HttpClientUtils;
import com.brillilab.httpclient.HttpRequestMethodEnum;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.io.IOException;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/httpclient.xml"})
public class HttpClientTest {

    private final String UTF8="utf-8";

    @Autowired
    CloseableHttpClient httpClient;

    @Autowired
    RequestConfig requestConfig;

    /**
     * HttpClient基本使用測試
     */
    @Test
    public void test01(){
        String url="http://localhost:8080/index";

        //建立http GET請求
        HttpRequestBase request = new HttpGet(url);
        //向請求添加config
        request.setConfig(requestConfig);

        CloseableHttpResponse response=null;
        try {
            //使用HttpClient發起請求得到響應
            response= httpClient.execute(request);
            //獲得響應實體
            HttpEntity entity = response.getEntity();
            Header[] headers = response.getAllHeaders();
            //将響應實體轉換為字元串
            String responseContext = EntityUtils.toString(entity,UTF8);

            for (Header header:headers){
                System.out.println("name:  "+header.getName()+"  value:  "+header.getValue());
            }
            System.out.println(responseContext);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //關閉資源
            try {
                if (httpClient!=null){
                    httpClient.close();
                }
                if (response!=null){
                    response.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

    }

    /**
     * HttpClientUtils測試
     */
    @Test
    public void test02(){
        String url="http://localhost:8080/index";

        String result = HttpClientUtils.sendHttp(HttpRequestMethodEnum.HttpGet, url, null, null);

        System.out.println(result);
    }
}
           

繼續閱讀