okhttp 的使用

okhttp 使用

构建post 表单请求

/**
     * 构造POST 表单请求
     * @param url url
     * @param fromParam form 表单参数
     * @param headers 自定义请求头
     * @return 响应流
     */
    @SneakyThrows
    public static Response doPostForm(String url, Map<String, Object> fromParam, Map<String, Object> headers) {
        //构造请求参数
        HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
        //构造请求体
        MultipartBody.Builder mBuilder = new MultipartBody.Builder();
        mBuilder.setType(MultipartBody.FORM);
        if (MapUtil.isNotEmpty(fromParam))
            fromParam.forEach((k, v) -> mBuilder.addFormDataPart(k, String.valueOf(v)));
        MultipartBody multipartBody = mBuilder.build();

        Request.Builder builder  = new Request.Builder();
        if (MapUtil.isNotEmpty(headers))
            headers.forEach((k, v) -> builder.addHeader(k, String.valueOf(v)));
        Request request = builder.url(urlBuilder.build().toString()).post(multipartBody).build();

        //发出同步请求
        return new OkHttpClient.Builder().build().newCall(request).execute();
    }

构建get请求

/**
     * 构造GET 请求
     * @param url url
     * @param param 参数map
     * @param headers 自定义请求头
     * @return 响应流
     */
    @SneakyThrows
    public static Response doGet(String url, Map<String, Object> param, Map<String, Object> headers) {
        //构造请求参数
        HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
        if (MapUtil.isNotEmpty(param))
            param.forEach((k, v) -> urlBuilder.addQueryParameter(k, String.valueOf(v)));

        Request.Builder builder  = new Request.Builder();
        if (MapUtil.isNotEmpty(headers))
            headers.forEach((k, v) -> builder.addHeader(k, String.valueOf(v)));
        Request request = builder.url(urlBuilder.build().toString()).get().build();

        //发出同步请求
        return new OkHttpClient.Builder().build().newCall(request).execute();
    }

构建post请求

/**
     * 构造携带accessToken POST 请求
     * @param url url
     * @param fromParam query请求参数 例:?userId=1&userName=张三
     * @param bodyParam 传参 raw格式
     * @return 响应流
     */
    @SneakyThrows
    public static Response doPost(String url, Map<String, Object> fromParam, Map<String, Object> bodyParam){
        //构造请求参数
        HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
        if (MapUtil.isNotEmpty(fromParam))
            fromParam.forEach((k, v) -> urlBuilder.addQueryParameter(k, String.valueOf(v)));

        //构造请求体
        RequestBody requestBody = RequestBody.
                create(MediaType.parse("application/json;charset=utf-8"), JSON.toJSONString(bodyParam));
        Request.Builder builder  = new Request.Builder();
        Request request = builder.url(urlBuilder.build().toString()).post(requestBody).build();
        //发出同步请求
        return new OkHttpClient.Builder().build().newCall(request).execute();
    }

相关导包

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.nacos.common.utils.MapUtil;
import lombok.SneakyThrows;
import okhttp3.*;
import org.apache.commons.lang3.ObjectUtils;
import java.util.Map;
import java.util.Objects;

处理Response转为JsonObject

/**
     * okhttp3 响应处理,返回jsonObject
     * @param response 响应流
     * @return JSONObject
     */
    public static JSONObject getResponseObject(Response response){
        try {
            if (response != null && response.body() != null) {
                return JSON.parseObject(response.body().byteStream(), JSONObject.class, Feature.OrderedField);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * okhttp3 响应处理
     * @param response 响应流
     * @param cls class
     * @return class
     */
    public static <T> T getResponseObject(Response response, Class<T> cls){
        try {
            if (response != null && response.body() != null) {
                return JSON.parseObject(response.body().byteStream(), cls, Feature.OrderedField);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * okhttp3 响应处理
     * @param response 响应流
     * @param cls class
     * @param feature feature
     * @return class
     */
    public static <T> T getResponseObject(Response response, Class<T> cls, Feature feature){
        try {
            if (response != null && response.body() != null) {
                return JSON.parseObject(response.body().byteStream(), cls, feature);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

忽略 ssl 证书

/**
     * 创建ssl http client
     * @return 忽略证书的https请求
     */
    public static OkHttpClient getSllHttpClient() {
        return new OkHttpClient.Builder()
                .sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.getX509TrustManager())
                .hostnameVerifier(SSLSocketClient.getHostnameVerifier())
                .build();
    }

import javax.net.ssl.*;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Arrays;

/**
 * 忽略SSL验证
 */
public class SSLSocketClient {

    //获取这个SSLSocketFactory
    public static SSLSocketFactory getSSLSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, getTrustManager(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //获取TrustManager
    private static TrustManager[] getTrustManager() {
        return new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[]{};
                    }
                }
        };
    }

    //获取HostnameVerifier
    public static HostnameVerifier getHostnameVerifier() {
        return (s, sslSession) -> true;
    }

    public static X509TrustManager getX509TrustManager() {
        X509TrustManager trustManager = null;
        try {
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init((KeyStore) null);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
            }
            trustManager = (X509TrustManager) trustManagers[0];
        } catch (Exception e) {
            e.printStackTrace();
        }

        return trustManager;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp是一个处理网络请求的开源项目,是Android使用最广泛的网络框架。它适用于Android 5.0(API级别21)和Java 8。使用OkHttp发送HTTP请求的过程如下: 1. 域名解析(DNS):将域名解析为IP地址。 2. 建立TCP连接:通过三次握手建立TCP连接。 3. 发起HTTP请求:建立TCP连接后,使用Socket输出流将HTTP报文写出。 4. 等待响应:等待服务器响应。 5. 解析响应:解析服务器返回的HTTP响应。 6. 处理响应数据:根据需要处理响应数据,比如解析JSON或下载文件。 在使用OkHttp时,首先需要创建一个Request对象,可以使用Request.Builder()来构建。然后通过Request对象获得一个Call对象,可以使用client.newCall(request)来创建。接下来,可以使用call.execute()进行同步调用或者call.enqueue()进行异步调用。最后,可以通过Response对象获取响应数据。 总之,使用OkHttp很简单,它的请求/响应API使用了流畅的构建器设计和不可变性设计,支持同步阻塞调用和带有回调的异步调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [android的OkHttp使用](https://blog.csdn.net/hanjiexuan/article/details/115894233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [android okhttp的基础使用【入门推荐】](https://download.csdn.net/download/weixin_38516386/12788438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值