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的使用方法。
阅读全文
0 0