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

猜你喜欢

转载自blog.csdn.net/weweeeeeeee/article/details/81032967