OkHttpClient 介绍

整体分为 5 步:

创建 HttpClient 对象
创建 请求 request 对象
执行请求
响应分析
资源释放

package com.maodou.autotest.utils;

import okhttp3.Interceptor;
import org.apache.http.client.HttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import okhttp3.*;

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class HttpClients {
    /**
     * 设置超时时间
     */
    private static final int CONNECT_TIMEOUT = 6;
    private static final int READ_TIMEOUT = 60;
    private static final int WRITE_TIMEOUT = 6;

    /**
     * 设置编码集
     */
    private static final String ENCODE = "UTF-8";

    /**
     * public Builder() {
     * dispatcher = new Dispatcher();
     * protocols = DEFAULT_PROTOCOLS; //默认支持的协议
     * connectionSpecs = DEFAULT_CONNECTION_SPECS; //默认的连接规范
     * proxySelector = ProxySelector.getDefault(); //默认的代理选择器,直连
     * cookieJar = CookieJar.NO_COOKIES; //默认不进行管理Cookie
     * socketFactory = SocketFactory.getDefault();
     * hostnameVerifier = OkHostnameVerifier.INSTANCE; //主机验证
     * certificatePinner = CertificatePinner.DEFAULT; //证书锁,默认不开启
     * proxyAuthenticator = Authenticator.NONE; //默认不进行授权
     * authenticator = Authenticator.NONE;
     * connectionPool = new ConnectionPool(); //连接池
     * dns = Dns.SYSTEM;
     * followSslRedirects = true;
     * followRedirects = true;
     * retryOnConnectionFailure = true;
     * //超时时间
     * connectTimeout = 10_000;
     * readTimeout = 10_000;
     * writeTimeout = 10_000;
     * }
     */
    public static String doGet(String url, String path, Map<String, Object> mapParams) {
        String resultString = "";
        Response response = null;
        try {
            //******** 一、 创建 httpClient 对象***********
            OkHttpClient httpClient = new OkHttpClient.Builder()
                    .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
                    .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
                    .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
                    .build();

            String params = setUrlParams(mapParams);
            StringBuffer strinb = new StringBuffer();
            strinb.append(url);
            strinb.append(path);
            strinb.append(params);

            // ******** 二、创建request 对象*************
            Request request = new Request.Builder()
                    .url(strinb.toString())
                    .get()
                    .build();

            //********* 三、发送请求 ********************

            response = httpClient.newCall(request).execute();

            //********* 四、对响应进行处理 ***************
            //1、如果 http 状态码不在 【200 ,300】区间内,抛出异常
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            // 因为服务器返回的数据可能非常大,所以必须通过数据流的方式来进行访问
            // 提供了诸如 string() 和 bytes() 这样的方法将流内的数据一次性读取完毕
            resultString = response.body().string();

            return resultString;
        } catch (SocketTimeoutException e) {
            // 超时
            System.out.println("executeHttpRequest TimeOut, e: " + e);
        } catch (IOException e) {
            // 网络IO异常
            System.out.println("executeHttpRequest IOException, e: " + e);
        } catch (Exception e) {
            // 其他异常
            e.printStackTrace();
        } finally {
            if (response != null) {
            // body 必须被关闭,否则会发生资源泄漏;
                response.body().close();
            }
        }
        return resultString;
    }

    public static String doPost(String url, String path, Map<String, Object> mapParams){

        Response response = null;
        String resultString = "";
        try{
            //******* 一、创建 httpClient 对象 **********
            OkHttpClient httpClient = new OkHttpClient.Builder()
                    .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
                    .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
                    .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
                    .build();

            StringBuffer stringB = new StringBuffer();
            stringB.append(url);
            stringB.append(path);
            FormBody.Builder body = new FormBody.Builder();
            for(Map.Entry<String,Object> entry : mapParams.entrySet()){
                body = new FormBody.Builder()
                        .add(entry.getKey(), entry.getValue().toString());
            }

            //******** 二、创建 request 对象 ************

            Request request = new Request.Builder()
                    .url(stringB.toString())
                    .post(body.build())
                    .build();
            //******** 三、执行请求 ********************
            response = httpClient.newCall(request).execute();

            //******** 四、处理响应 ********************
            if(!response.isSuccessful()){
                throw new IOException( " Unexpect code " + response);
            }

            resultString = response.body().string();
            
        }catch (SocketTimeoutException e) {
            // 超时
            System.out.println("executeHttpRequest TimeOut, e: " + e);
        } catch (IOException e) {
            // 网络IO异常
            System.out.println("executeHttpRequest IOException, e: " + e);
        } catch (Exception e) {
            // 其他异常
            e.printStackTrace();
        } finally {
            if (response != null) {
                // body 必须被关闭,否则会发生资源泄漏;
                response.body().close();
            }
        }
        return resultString;
    }

    public static String setUrlParams(Map<String, Object> mapParams) {

        // 是否已经设置了问号
        boolean hasSetQuestionMark = false;
        StringBuffer strParams = new StringBuffer("");
        if (mapParams != null) {
            Iterator<String> iterator = mapParams.keySet().iterator();
            String key = "";
            while (iterator.hasNext()) {
                try {
                    key = iterator.next().toString();
                    if (!hasSetQuestionMark) {
                        strParams.append("?").append(key).append("=")
                                .append(URLEncoder.encode(mapParams.get(key).toString(), "utf-8"));
                        hasSetQuestionMark = true;
                        continue;
                    }
                    strParams.append("&").append(key).append("=")
                            .append(URLEncoder.encode(mapParams.get(key).toString(), "utf-8"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return strParams.toString();
    }

    public static void main(String[] args){
        Map<String, Object> getParams = new HashMap<>();

        Map<String, Object> postParams = new HashMap<>();
        getParams.put("word", "%E4%BD%A0%E5%A5%BD");
        postParams.put("url","/search");
        String result1 = doGet("http://wenku.baidu.com", "/search/interface/getrelatequery", getParams);
        System.out.println(result1);
        String result2 = doPost("http://wenku.baidu.com", "/message/getnotice", postParams);
        System.out.println(result2);
    }
}

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值