HttpClient之用CloseableHttpClient发送post请求

HttpClient之用CloseableHttpClient发送post请求


一、使用HttpClient发送请求的一般步骤

(1) 创建HttpClient对象。
(2)创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
(3) 如果需要发送请求参数,可调用HttpGet同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,可调用setEntity(HttpEntity entity)方法来设置请求参数。
(4) 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
(5) 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
(6) 释放连接。无论执行方法是否成功,都必须释放连接

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
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.HttpPost;
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.apache.log4j.Logger;
public class HttpTest {
protected static Logger logger = Logger.getLogger(HttpTest.class);
//请求超时时间,这个时间定义了socket读数据的超时时间,也就是连接到服务器之后到从服务器获取响应数据需要等待的时间,发生超时,会抛出SocketTimeoutException异常。
private static final int SOCKET_TIME_OUT = 60000;
//连接超时时间,这个时间定义了通过网络与服务器建立连接的超时时间,也就是取得了连接池中的某个连接之后到接通目标url的连接等待时间。发生超时,会抛出ConnectionTimeoutException异常
private static final int CONNECT_TIME_OUT = 60000;
private static List createParam(Map<String, Object> param) {
//建立一个NameValuePair数组,用于存储欲传送的参数
List nvps = new ArrayList ();
if(param != null) {
for(String k : param.keySet()) {
nvps.add(new BasicNameValuePair(k, param.get(k).toString()));
}
}
return nvps;
}

/**
 * 发送  post 请求
 * @param url 请求地址,如 http://www.baidu.com
 * @param param相关参数, 模拟form 提交
 * @return
 * @throws Exception 
 */
public static String postForAPP(String url, String sMethod, Map<String, Object> param, Map<String, Object> headers) throws Exception {
    //目前HttpClient最新版的实现类为CloseableHttpClient
    CloseableHttpClient client = HttpClients.createDefault();
    CloseableHttpResponse response = null;
    HttpEntity entity=null;
    try {
        if(param != null) {
            //建立Request的对象,一般用目标url来构造,Request一般配置addHeader、setEntity、setConfig
            HttpPost req = new HttpPost(url);
            entity=new UrlEncodedFormEntity(createParam(param), Consts.UTF_8);
            //setHeader,添加头文件
            Set<String> keys = headers.keySet();
            for (String key : keys) {
                req.setHeader(key, headers.get(key).toString());
            }
            //setConfig,添加配置,如设置请求超时时间,连接超时时间
            RequestConfig reqConfig = RequestConfig.custom().setSocketTimeout(SOCKET_TIME_OUT).setConnectTimeout(CONNECT_TIME_OUT).build();
            req.setConfig(reqConfig);
            //setEntity,添加内容
            req.setEntity(entity);
            //执行Request请求,CloseableHttpClient的execute方法返回的response都是CloseableHttpResponse类型
            //其常用方法有getFirstHeader(String)、getLastHeader(String)、headerIterator(String)取得某个Header name对应的迭代器、getAllHeaders()、getEntity、getStatus等
            response = client.execute(req);
            entity =  response.getEntity();
            //用EntityUtils.toString()这个静态方法将HttpEntity转换成字符串,防止服务器返回的数据带有中文,所以在转换的时候将字符集指定成utf-8就可以了
            String result= EntityUtils.toString(entity, "UTF-8");
            logger.error("-------------------------"+result+"-------------");
            if(response.getStatusLine().getStatusCode()==200){
                logger.error(result+"-----------success------------------");
                return result;
            }else{
                logger.error(response.getStatusLine().getStatusCode()+"------------------fail-----------");
                return null;
            }
        }
        return null;
    } catch(Exception e) {
        logger.error("--------------------------post error: ", e);
        throw new Exception();
    }finally{
        //一定要记得把entity fully consume掉,否则连接池中的connection就会一直处于占用状态
        EntityUtils.consume(entity);
        logger.error("---------------------------finally-------------");
        System.out.println("---------------------------------------------------");
    }
}


public static void main(String[] args) throws Exception {
    Map<String, Object> param=new HashMap<String, Object>();
    param.put("pdata", "mm");
    Map<String, Object> headers=new HashMap<String, Object>();
    headers.put("appid", "mm");
    postForAPP("http://localhost:8080/SpringMVC-httpclient/greeting", "aa", param, headers);
}

该处使用的url网络请求的数据。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会为您介绍Java中使用CloseableHttpClient发送HTTP请求的方法。 CloseableHttpClient是Apache HttpClient库中的一个类,它提供了一种发送HTTP请求的简单方法。下面是一些基本的使用方法: 1. 创建CloseableHttpClient对象 ```java CloseableHttpClient httpClient = HttpClients.createDefault(); ``` 2. 创建HttpRequest对象 HttpRequest是一个接口,它定义了HTTP请求的各种方法和属性。在使用CloseableHttpClient发送HTTP请求之前,我们需要先创建一个HttpRequest对象。常用的HttpRequest实现类有HttpGet、HttpPost、HttpPut、HttpDelete等,具体选择哪种实现类取决于你要发送的HTTP请求的类型。 例如,我们可以创建一个HttpGet对象: ```java HttpGet httpGet = new HttpGet("http://www.example.com"); ``` 3. 执行HTTP请求 创建好HttpRequest对象之后,我们就可以使用CloseableHttpClient对象来执行HTTP请求了。执行HTTP请求的方式很简单,只需要调用CloseableHttpClient对象的execute方法,并传入HttpRequest对象即可。 例如,我们可以执行上面创建的HttpGet对象: ```java CloseableHttpResponse response = httpClient.execute(httpGet); ``` 4. 处理HTTP响应 执行HTTP请求之后,我们需要处理HTTP响应。CloseableHttpResponse是一个接口,它定义了HTTP响应的各种方法和属性。我们可以使用这些方法来获取HTTP响应的状态码、响应头、响应体等信息。 例如,我们可以获取HTTP响应的状态码: ```java int statusCode = response.getStatusLine().getStatusCode(); ``` 5. 关闭CloseableHttpClient对象 最后,我们需要关闭CloseableHttpClient对象。关闭CloseableHttpClient对象可以释放与之相关的资源,例如HTTP连接、线程等。我们可以使用CloseableHttpClient对象的close方法来关闭它。 例如: ```java httpClient.close(); ``` 以上就是使用CloseableHttpClient发送HTTP请求的基本方法。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满@WJW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值