Java后端的http post异步请求(带回调函数)

package com.xxx.framework.common.util;
	
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.concurrent.FutureCallback;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.protocol.HTTP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

public class HttpAsyncUtils {

   	private static Logger log = LoggerFactory.getLogger(HttpAsyncUtils.class);
   
    /**
     * POST方式调用(带回调函数)
     *
     * @param url
     * @param params 参数为NameValuePair键值对对象<br>
     * 		  List<NameValuePair> params = new ArrayList<NameValuePair>();<br>
     *	      params.add(new BasicNameValuePair(name, value));
     * @param header 请求头部
     * @param needHeader 是否需要头部
     * @param callback 回调方法<br>
     *        返回值为 FutureCallback<HttpResponse> 的方法<br>
     *        方法内返回 new FutureCallback<HttpResponse>() {重写 completed, failed, cancelled 方法}
     * @return 响应字符串
     */
    public static void httpPostCallback(CloseableHttpAsyncClient httpclient, String url, List<NameValuePair> params, Map<String, String> header, boolean needHeader, FutureCallback<HttpResponse> callback) throws Exception {
        HttpPost post = new HttpPost(url);

        URL testUrl = new URL(url);
        HttpURLConnection urlConnection = (HttpURLConnection)testUrl.openConnection();
        try {
            urlConnection.connect();
        } catch (IOException e) {
            throw new ConnectException(e.getMessage());
        } finally {
            urlConnection.disconnect();
        }

        if(needHeader){
            for(String key : header.keySet()){
                post.setHeader(key, header.get(key));
            }
        }
        // 传入HttpPost
        httpclient.start();
        try{
            log.info("HttpAsyncUtils httpPostCallback Param : {}", params);
            if (params != null) {
                post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            }
            httpclient.execute(post, callback);
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
}

调用

List param = new ArrayList<>();
param.add(new BasicNameValuePair("id", ""));
   
Map map = getHeadersInfo(request);
   
CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
HttpAsyncUtils.httpPostCallback(
    httpclient,
    url,
    param,
    map,
    true,
    callback(httpclient)
);
   
/**
 * 异步请求完成的回调方法
 * @return
 */
private FutureCallback<HttpResponse> callback(CloseableHttpAsyncClient httpclient) {
    return new FutureCallback<HttpResponse>() {
        @Override
        public void completed(final HttpResponse response) {
            try {
                String responseJson = null;
                responseJson = EntityUtils.toString(response.getEntity(), "UTF-8");
                
                log.info("callback completed response content is : {}", responseJson);
            } catch (IOException e) {
                e.printStackTrace();
                log.info("callback completed errorMsg : {}", e.getMessage());
            } finally {
                try {
                    httpclient.close();
                    log.info("callback completed httpclient close");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void failed(Exception ex) {
            try {
                httpclient.close();
                log.info("callback failed httpclient close");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void cancelled() {
            try {
                httpclient.close();
                log.info("callback cancelled httpclient close");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
}

/**
 * 处理请求头部信息
 * @param request 请求
 * @return
 */
public static Map<String, String> getHeadersInfo(HttpServletRequest request) {
    Map<String, String> map = new HashMap<String, String>();
    Enumeration headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String key = (String) headerNames.nextElement();
        String value = request.getHeader(key);
        map.put(key, value);
    }
    return map;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java后端发送HttpPost请求的步骤如下: 1. 创建HttpClient对象。 2. 创建HttpPost对象,并设置请求的URL。 3. 设置请求参数,可以使用NameValuePair或者HttpEntity。 4. 执行请求,获取HttpResponse对象。 5. 解析HttpResponse对象,获取响应结果。 具体实现可以参考以下代码: ``` import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class HttpPostExample { public static void main(String[] args) { HttpClient httpClient = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost("http://example.com/api"); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("param1", "value1")); params.add(new BasicNameValuePair("param2", "value2")); try { httpPost.setEntity(new UrlEncodedFormEntity(params)); httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity != null) { String response = EntityUtils.toString(httpEntity); System.out.println(response); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值