httpClient相关整理

2019-04-29 11:00:55  卢浮宫  版权声明:本文为站长原创文章,转载请写明出处


一、背景    

   之前也写了一个关于网络请求的文章,最近频繁用到httpClient,并且需求更加繁琐,所以这里做一个最终版的整理。

        1. 创建HttpClient对象。

        2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

        3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;

           对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

        4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

        5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,

           该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

        6. 释放连接。无论执行方法是否成功,都必须释放连接


二、还是直接贴代码吧

    相关说明都在注释里面了,首先是HttpUtil(这里会贴出两个代码段,第一个是正常情况下获取httpClient,后者是启用代理情况下的)

//不启用代理情况,不传递参数

public static HttpClient getHttpClient() {
@SuppressWarnings("deprecation")
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpClientParams.setCookiePolicy(httpClient.getParams(), CookiePolicy.BROWSER_COMPATIBILITY);
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 20000);
//读取超时
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 20000);
//httpClient.get
httpClient.addResponseInterceptor(new HttpResponseInterceptor() {
@Override
public void process(HttpResponse response, HttpContext context)
throws HttpException, IOException {
// TODO Auto-generated method stub
HttpEntity entity = response.getEntity();
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
response.setEntity(new GzipDecompressingEntity(
response.getEntity()));
return;
}
}
}
}

});
return httpClient;
}

     

//启用代理情况,传入代理IP及端口

package com.xmy.tongchengpush.util;

import org.apache.http.*;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.GzipDecompressingEntity;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HttpContext;
import java.io.IOException;

/**
*@Author: Administrator on 2019/4/26 14:04
*@param:
*@return:
*@Description:HttpCilicent工具类
**/
public class HttpUtil {
public static HttpClient getHttpClient(String proxyHost, int proxyPort){
@SuppressWarnings("deprecation")
DefaultHttpClient httpClient = new DefaultHttpClient();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
String userName="这里是启用代理情况下的用户名";
String password="这里是启用代理情况下的用户密码";
credsProvider.setCredentials(
new AuthScope(proxyHost,proxyPort),
new UsernamePasswordCredentials(userName,password));
httpClient.setCredentialsProvider(credsProvider);
HttpHost proxy = new HttpHost(proxyHost, proxyPort, "http");
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 900000);
//读取超时
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 90000);
httpClient.addResponseInterceptor(new HttpResponseInterceptor() {

@Override
public void process(HttpResponse response, HttpContext context)
throws HttpException, IOException {
// TODO Auto-generated method stub
HttpEntity entity = response.getEntity();
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
response.setEntity(new GzipDecompressingEntity(
response.getEntity()));
return;
}
}
}
}

});
return httpClient;
}
}



三、调用部分(传入json数据)  

    
    public static void doPricePush(JSONObject jsonParam) throws IOException {
String url = "请求地址";
String token = "XXX";
int timeStr = DateUtil.getSecondTimestamp(new Date());
String signStr = "XXX"+ token + timeStr;
String singnKey = Md5Util.MD5(signStr);
HttpClient httpClient = HttpUtil.getHttpClient("代理IP",代理端口);
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type","application/json;charset=utf-8");

//设置请求头内容
httpPost.setHeader("X-MERCHANT-ID","XXX");
httpPost.setHeader("X-TIMESTAMP",Long.toString(timeStr));
httpPost.setHeader("X-SIGNDATA",singnKey);
//设置请求参数,解决中文乱码问题
StringEntity entity = new StringEntity(jsonParam.toString(),"utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
HttpEntity respEntity = response.getEntity();
// InputStream instreams = respEntity.getContent(); //inputstream数据返回格式
String content = EntityUtils.toString(respEntity,"UTF-8");

logger.info(jsonParam.toString());
}


    


更多精彩请关注guangmuhua.com


最新评论: