29.3ApiService

来源:互联网 发布:天天酷跑解封软件 编辑:程序博客网 时间:2024/06/03 04:23

前篇Httpclient和Spring的整合已做介绍,下面可以进行功能开发了,如果项目中多个service需要用到httpclient,那我们需要抽取公用的service来给多个service服务,较少代码冗余。

抽取的service为ApiService.java文件,一般在controller中进行post请求的返回空或者其他具体内容(响应体),还要给调用方返回状态码,让调用方根据状态码去进行处理。所以要创建一个对象,用于封装post返回的内容。具体代码如下:
HttpResult.java

package com.taotao.common.bean;public class HttpResult {    private Integer code;    private String data;    public HttpResult() {    }    public HttpResult(Integer code, String data) {        this.code = code;        this.data = data;    }    public Integer getCode() {        return code;    }    public void setCode(Integer code) {        this.code = code;    }    public String getData() {        return data;    }    public void setData(String data) {        this.data = data;    }}

ApiService.java

package com.taotao.web.service;import java.io.IOException;import java.net.URISyntaxException;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.utils.URIBuilder;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.taotao.common.bean.HttpResult;@Servicepublic class ApiService {    @Autowired    private CloseableHttpClient httpClient;    @Autowired    private RequestConfig requestConfig;    /**     * 执行GET请求,200返回响应内容,其他状态码返回null     *      * @param url     * @return     * @throws ClientProtocolException     * @throws IOException     */    public String doGet(String url) throws ClientProtocolException, IOException{     // 创建http GET请求             HttpGet httpGet = new HttpGet(url);     // 设置请求参数     httpGet.setConfig(this.requestConfig);     CloseableHttpResponse response = null;     try {         // 执行请求         response = httpClient.execute(httpGet);         // 判断返回状态是否为200         if (response.getStatusLine().getStatusCode() == 200)              {                 return EntityUtils.toString(response.getEntity(), "UTF-8");                     }          } finally {                 if (response != null) {                         response.close();                     }                 }         return null;         }    /**     * 指定带有参数的GET请求     *      * @param url     * @param param     * @return     * @throws ClientProtocolException     * @throws IOException     * @throws URISyntaxException     */    public String doGet(String url, Map<String, String>param) throws ClientProtocolException, IOException, URISyntaxException{            URIBuilder builder = new URIBuilder(url);            for (Map.Entry<String, String>entry : param.entrySet()) {                        builder.addParameter(entry.getKey(), entry.getValue());                    }            return doGet(builder.build().toString());        }/**     * 带有参数的post请求     *      * @param url     * @param param     * @return * @throws ClientProtocolException     * @throws IOException     */    public HttpResult doPost(String url, Map<String, String>param) throws ClientProtocolException, IOException{        // 创建http POST请求         HttpPost httpPost = new HttpPost(url);        // 设置请求参数        httpPost.setConfig(this.requestConfig);        if (null != param) {        // 设置post参数            List<NameValuePair>parameters = new ArrayList<NameValuePair>(0);            for (Map.Entry<String, String>entry : param.entrySet()) {            parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));                        }        // 构造一个form表单式的实体            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8");        // 将请求实体设置到httpPost对象中            httpPost.setEntity(formEntity);           }        CloseableHttpResponse response = null;        try {            // 执行请求            response = httpClient.execute(httpPost);            return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(            response.getEntity(), "UTF-8"));            } finally {                    if (response != null) {                    response.close();                                }                }        }/**     * 执行post请求     *      * @param url     * @return     * @throws ClientProtocolException     * @throws IOException     */    public HttpResult doPost(String url) throws ClientProtocolException, IOException {            return doPost(url, null);        }}

疑问:为什么post提交需要返回状态码,而get提交不需要呢?
因为get我们常用的就两种状态码:200请求到内容;404返回null,所以代码中通过返回null表示请求失败。

这样我们其他service在使用的时候,直接使用ApiService就可以了,不需要再去写关于httpclient本身一些api的使用方法。