29.3ApiService

前篇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;

@Service
public 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的使用方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值