OkHttpUtils java post 异步post 提交

41 篇文章 1 订阅
38 篇文章 0 订阅

工具

package com.wjj.application.util;

import com.alibaba.fastjson.JSON;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

/**
 * http 工具
 *
 * @author hank
 */
@Component
public class OkHttpUtils {
    private final static Logger logger = LoggerFactory.getLogger(OkHttpUtils.class);

    //静态内部类 单例 懒加载
    private static class HttpClientInstance{
        private static OkHttpClient httpClient = new OkHttpClient().newBuilder()
                .connectTimeout(120, TimeUnit.SECONDS)
                .readTimeout(120, TimeUnit.SECONDS)
                .connectionPool(new ConnectionPool(50, 5L, TimeUnit.MINUTES))
                .build();
    }
    /**
     * 发起异步post请求
     *
     * @param url
     * @param params
     * @return
     */
    public static void postAsync(String url, Map<String, Object> params, Consumer<Response> success, Consumer<Exception> fail) {
        FormBody.Builder builder = new FormBody.Builder();
        if (params != null) {
            params.forEach((k, v) -> {
                if (null != v) {
                    builder.add(k, String.valueOf(v));
                }
            });
        }

        RequestBody body = builder.build();
        Request req = new Request.Builder().url(url).post(body)
                .build();
        logger.info("postAsync request url:{}; params: {}", url, JSON.toJSON(params));
        HttpClientInstance.httpClient.newCall(req).enqueue(new Callback() {
            //成功回调
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                logger.info("postAsync response url:{}; HTTP status message: {}", url, response.message());
                if (response.isSuccessful()) {
                    if (null != success) {
                        success.accept(response);
                    }
                } else {
                    if (null != fail) {
                        fail.accept(new Exception(response.message()));
                    }
                }
                if (null != response.body()) {
                    response.body().close();
                }
            }

            //请求错误回调方法
            @Override
            public void onFailure(Call call, IOException e) {
                if (null != fail) {
                    fail.accept(e);
                }
            }
        });
    }

    /**
     * 发起异步post请求
     *
     * @param url
     * @param params
     * @return
     */
    public static void postAsync(String url, Map<String, Object> params, Consumer<Response> success) {
        OkHttpUtils.postAsync(url, params, success, e -> logger.error("http post error:" + url, e));
    }

    /**
     * 发起同步post请求
     *
     * @param url
     * @param params
     * @return
     */
    public static String post(String url, Map<String, Object> params) throws Exception {
        FormBody.Builder builder = new FormBody.Builder();
        if (params != null) {
            params.forEach((k, v) -> {
                if (null != v) {
                    builder.add(k, String.valueOf(v));
                }
            });
        }

        RequestBody body = builder.build();
        Request req = new Request.Builder().url(url).post(body)
                .build();
        return executeRequest(req);
    }

    /**
     * Get请求
     *
     * @param url url
     * @param params 参数
     * @paran isParamEncode 参数是否需要encode
     */
    public static String httpGet(String url, Map<String, Object> params, boolean isParamEncode) throws Exception {
        if(null != params && !params.isEmpty()){
            StringBuilder paramStr = new StringBuilder();
            int i = 0;
            for (Map.Entry<String, Object> item : params.entrySet()) {

                paramStr.append(item.getKey()).append("=");
                if(isParamEncode){
                    paramStr.append(URLEncoder.encode(item.getValue().toString(), "utf-8"));
                }else{
                    paramStr.append(item.getValue().toString());
                }
                i++;
                if(i!=params.size()){
                    paramStr.append("&");
                }
            }
            //没有?加?
            if(!url.contains("?")){
                url += "?" + paramStr;
            }
            //有? (?是最后或者&是最后)
            else if(url.indexOf("?") == url.length()-1 || url.indexOf("&") == url.length()-1){
                url += paramStr;
            }
            else {
                url += "&" + paramStr;
            }
        }

        Request request = new Request.Builder().url(url).build();
        return executeRequest(request);
    }

    /**
     * get 请求
     * @param url
     * @param params
     * @return
     * @throws Exception
     */
    public static String httpGet(String url, Map<String, Object> params) throws Exception {
        return httpGet(url, params, true);
    }

    private static String executeRequest(Request request) throws Exception {
        Response response = null;
        response = HttpClientInstance.httpClient.newCall(request).execute();

        if (response.isSuccessful()) {
            try(ResponseBody responseBody = response.body()) {
                return responseBody == null ? null : responseBody.string();
            }catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
        } else {
            throw new Exception("response not Success response_code: " + response.code() + "response_msg: "+response.message());
        }
    }
}

 简易异步post 使用方式:

OkHttpUtils.postAsync(url, params, success, e->logger.error("http post error:" + url, e));
           OkHttpUtils.postAsync(URL, new HashMap<String, Object>(){{
                put("timestamp", timestamp);
                put("key", key);
                put("user_name", ACCOUNT);
                put("mobile", phone);
                put("message", SIGN+msg);
            }}, (Response response) -> {
                String reJson = "null";
                try {
                    reJson = response.body().string();
                    JSONObject jsonObject = JSON.parseObject(reJson);
                    if(!jsonObject.getInteger("code").equals(0)){
                        logger.error("Niubaifa ret: {}", reJson);
                    }else{
                        logger.info("Niubaifa ret: {}", reJson);
                    }
                } catch (IOException e) {
                    logger.error("Niubaifa IOException ret: {}", reJson);
                    e.printStackTrace();
                }
            });

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值