整理HttpClient4.5的Fluent API的用法

来源:互联网 发布:朗读语文课文软件 编辑:程序博客网 时间:2024/06/07 00:45

这是接着上一篇对HttpClient4.5的使用总结,HttpClient真是一个好东西,一直保持更新,还推出流畅的写法,使得代码更加简洁易懂,非常好用。

HttpClient Tutorial:

https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/index.html

这篇blog介绍的是Fluent API的用法,我把最常用的的get和post方法封装成服务类,如下介绍。

mavne依赖:

<dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpclient</artifactId>    <version>4.5.2</version></dependency><dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpmime</artifactId>    <version>4.5.2</version></dependency><dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpclient-osgi</artifactId>    <version>4.5.2</version></dependency><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-lang3</artifactId>    <version>3.1</version></dependency><dependency>    <groupId>org.apache.velocity</groupId>    <artifactId>velocity</artifactId>    <version>1.7</version></dependency>

服务类HttpFluentService,封装get和post方法:

import com.google.common.collect.Lists;import org.apache.commons.collections.CollectionUtils;import org.apache.commons.collections.MapUtils;import org.apache.commons.lang3.StringUtils;import org.apache.http.Consts;import org.apache.http.HttpEntity;import org.apache.http.HttpHost;import org.apache.http.NameValuePair;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.fluent.Request;import org.apache.http.client.utils.URLEncodedUtils;import org.apache.http.entity.ContentType;import org.apache.http.entity.mime.MultipartEntityBuilder;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.Args;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.List;import java.util.Map;/** * @author wzx * @time 2017/1/20 */public class HttpFluentService {    private static final Logger LOGGER = LoggerFactory.getLogger(HttpFluentService.class);    public String doGet(String url) {        try {            return Request.Get(url).execute().returnContent().asString(Consts.UTF_8);        } catch (IOException e) {            e.printStackTrace();        }        return null;    }    public String doGet(String url, Map<String, String> paramMap) {        return doGet(url, null, null, null, paramMap);    }    public String doGet(String url, String hostName, Integer port, String schemeName, Map<String, String> paramMap) {        return executeGet(url, hostName, port, schemeName, paramMap);    }    private String executeGet(String url, String hostName, Integer port, String schemeName, Map<String, String> paramMap) {        Args.notNull(url, "url");        url = buildGetParam(url, paramMap);        Request request = Request.Get(url);        request = buildProxy(request, hostName, port, schemeName);        try {            return request.execute().returnContent().asString(Consts.UTF_8);        } catch (IOException e) {            LOGGER.error(e.getMessage(), e.toString());        }        return null;    }    private String buildGetParam(String url, Map<String, String> paramMap) {        Args.notNull(url, "url");        if(MapUtils.isNotEmpty(paramMap)) {            List<NameValuePair> paramList = Lists.newArrayListWithCapacity(paramMap.size());            for (String key : paramMap.keySet()) {                paramList.add(new BasicNameValuePair(key, paramMap.get(key)));            }            //拼接参数            url += "?" + URLEncodedUtils.format(paramList, Consts.UTF_8);        }        return url;    }    public String doPost(String url) {        return doPost(url, null);    }    public String doPost(String url, List<NameValuePair> nameValuePairs) {        return doPost(url, null, null, null, nameValuePairs, null);    }    public void doPost(String url, List<NameValuePair> nameValuePairs, List<File> files) {        doPost(url, null, null, null, nameValuePairs, files);    }    public String doPost(String url, String hostName, Integer port, String schemeName, List<NameValuePair> nameValuePairs, List<File> files) {        return executePost(url, hostName, port, schemeName, nameValuePairs, files);    }    private String executePost(String url, String hostName, Integer port, String schemeName, List<NameValuePair> nameValuePairs, List<File> files) {        Args.notNull(url, "url");        HttpEntity entity = buildPostParam(nameValuePairs, files);        Request request = Request.Post(url).body(entity);        request = buildProxy(request, hostName, port, schemeName);        try {            return request.execute().returnContent().asString(Consts.UTF_8);        } catch (IOException e) {            LOGGER.error(e.getMessage(), e.toString());        }        return null;    }    /**     * 构建POST方法请求参数     * @return     */    private HttpEntity buildPostParam(List<NameValuePair> nameValuePairs, List<File> files) {        if(CollectionUtils.isEmpty(nameValuePairs) && CollectionUtils.isEmpty(files)) {            return null;        }        if(CollectionUtils.isNotEmpty(files)) {            MultipartEntityBuilder builder = MultipartEntityBuilder.create();            for (File file : files) {                builder.addBinaryBody(file.getName(), file, ContentType.APPLICATION_OCTET_STREAM, file.getName());            }            for (NameValuePair nameValuePair : nameValuePairs) {                //设置ContentType为UTF-8,默认为text/plain; charset=ISO-8859-1,传递中文参数会乱码                builder.addTextBody(nameValuePair.getName(), nameValuePair.getValue(), ContentType.create("text/plain", Consts.UTF_8));            }            return builder.build();        } else {            try {                return new UrlEncodedFormEntity(nameValuePairs);            } catch (UnsupportedEncodingException e) {                LOGGER.error(e.getMessage(), e.toString());            }        }        return null;    }    /**     * 设置代理     * @param request     * @param hostName     * @param port     * @param schemeName     * @return     */    private Request buildProxy(Request request, String hostName, Integer port, String schemeName) {        if(StringUtils.isNotEmpty(hostName) && port != null) {            //设置代理            if (StringUtils.isEmpty(schemeName)) {                schemeName = HttpHost.DEFAULT_SCHEME_NAME;            }            request.viaProxy(new HttpHost(hostName, port, schemeName));        }        return request;    }}

单元测试:

private String url = "https://hc.apache.org/httpcomponents-client-4.5.x/examples.html";@Test    public void testGet() {        String result = fluentService.doGet(url);        LOGGER.info("返回结果:{}", result);    }    @Test    public void testGetParam() {        HashMap<String, String> map = Maps.newHashMap();        map.put("name", "wang");        map.put("value", "hello");        String result = fluentService.doGet(url, map);        LOGGER.info("返回结果:{}", result);    }    @Test    public void testGetProxy() {        HashMap<String, String> map = Maps.newHashMap();        map.put("name", "wang");        map.put("value", "hello");        String result = fluentService.doGet(url, "localhost", 8888, null, map);        LOGGER.info("返回结果:{}", result);    }    @Test    public void testPost() {        String result = fluentService.doPost(url, null);        LOGGER.info("返回结果:{}", result);    }    @Test    public void testPostProxy() {        String result = fluentService.doPost(url, "119.28.99.246", 8998, null, null, null);        LOGGER.info("返回结果:{}", result);    }    @Test    public void testPostParam() throws IOException, URISyntaxException {        List<NameValuePair> nameValuePairs = Lists.newArrayList();        nameValuePairs.add(new BasicNameValuePair("name", "王志雄"));        List<File> fileList = Lists.newArrayList();        fileList.add(new File("D:\\response.html"));        String result = fluentService.doPost(url, "localhost", 8888, HttpHost.DEFAULT_SCHEME_NAME, nameValuePairs, fileList);        LOGGER.info("返回结果:{}", result);    }
0 0
原创粉丝点击