使用okhttp.jar;okio.jar用java实现http请求

1、注意事项

使用的jar为okio-1.9.0.jar和okhttp-3.8.0.jar;

如果okio架包偏低就会报错;okhttp架包版本过低也会出现架包冲突;

2、网上的例子:

private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    Headers responseHeaders = response.headers();
    for (int i = 0; i < responseHeaders.size(); i++) {
      System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
    }

    System.out.println(response.body().string());
  }

3、利用多线程以及CountDownLatch实现利用在后台实现多线程http请求:

OkHttpClient   httpClient=new OkHttpClient();
        Request request=new Request.Builder()
                        .url(url)
                        .build();
        //得到response对象
        Response response=httpClient.newCall(request).execute();
        if(response.isSuccessful()){
            String result=response.body().string();
            System.out.println(response.code());
            System.out.println(response.message());
            System.out.println(result);
        }

使用main方法进行入口测试:

public static void main(String[] args) {
    CountDownLatch latch=new CountDownLatch(1);
    String url="http://test.meyki.net:9080/apidev/v3/goods/goodsList/eyJwYWdlU2l6ZSI6IjIwIiwib3MiOiJpb3MiLCJzaG9wSWQiOiI1MTU2MjNmNGVlOGU0OGIxYmU3MmY2MGFiOTcxZTExOSIsInVzZXJJZCI6IjIyNTg0MDVmYTU5ODRlOTViNWI2NTI4ZTM3YmExODBjIiwicGFnZU5vIjoiMSIsImlzU2hlbHZlcyI6IjEiLCJ2Y29kZSI6IjE0MCIsInRhZyI6IjEifQ==";
    for(int i=0;i<=15;i++){
        Thread thread=new Thread(new Mythread(latch,url));
        thread.start();
    }
    latch.countDown();
}

详解:

2.1 OkHttp计划使用三种类型连接到你的web服务器:URL, Address, 和 Route。

URLs(如https://github.com/square/okhttp)是HTTP和因特网的基础。除了是网络上通用和分散的命名方案,他们还指定了如何访问网络资源。

URLs摘要:
  • 它们指定该呼叫(Call)可以被明文(HTTP)或加密的(HTTPS),但不指定用哪种加密算法。他们也不指定如何验证对方的证书(HostnameVerifier)或证书可以信任(SSLSocketFactory)。
  • 他们不指定是否应使用特定的代理服务器或如何与该代理服务器进行身份验证。

他们还具体:每个URL识别特定的路径(如 /square/okhttp)和查询(如 ?q=sharks&lang=en)。每个Web服务器主机的网址。

2.2 Addresses

Addresses指定网络服务器(如github.com)和所有的静态必要的配置,以及连接到该服务器:端口号,HTTPS设置和首选的网络协议(如HTTP / 2SPDY)。

共享相同地址的URL也可以共享相同的基础TCP套接字连接。共享一个连接有实实在在的性能优点:更低的延迟,更高的吞吐量(由于TCP慢启动)和保养电池。OkHttp使用的ConnectionPool自动重用HTTP / 1.x的连接和多样的HTTP/ 2和SPDY连接。

在OkHttp地址的某些字段来自URL(scheme, hostname, port),其余来自OkHttpClient

2.3 Routes

Routes提供连接到一个网络服务器所必需的动态信息。就是尝试特定的IP地址(如由DNS查询发现),使用确切的代理服务器(如果一个特定的IP地址的ProxySelector在使用中)和协商的TLS版本(HTTPS连接)。

可能有单个地址对应多个路由。例如,在多个数据中心托管的Web服务器,它可能会在其DNS响应产生多个IP地址。

 

当你使用OkHttp进行一个URL请求时,下面是它的操作流程:

  1. 它使用URL和配置OkHttpClient创建一个address。此地址指定我们将如何连接到网络服务器。
  2. 它通过地址从连接池中取回一个连接。
  3. 如果它没有在池中找到连接,它会选择route尝试。这通常意味着使用一个DNS请求, 以获取服务器的IP地址。如果需要,它会选择一个的TLS版本和代理服务器。
  4. 如果它是一个新的route,它连接通过建立无论是直接的socket连接,socket连接使用TLS安全通道(用于HTTPS通过一个HTTP代理),或直接TLS连接。它的TLS握手是必要的。
  5. 它发送HTTP请求并读取响应。
    如果有连接出现问题,OkHttp将选择另一条route,然后再试一次。这带来的好处是当一个服务器的地址的一个子集是不可达时,OkHttp能够自动恢复。当连接池是过时或者试图TLS版本不受支持时,这种方式是很有用的。

一旦响应已经被接收到,该连接将被返回到池中,以便它可以在将来的请求中被重用。连接在池中闲置一段时间后,它会被赶出。

 

 

3.3访问头

典型的HTTP头工作就像一个Map<String, String> :每个字段都有一个值或无值。但是,一些头部(headers)允许多个值,比如Guava的Multimap。例如,它共同为一个HTTP响应提供多个Vary头。OkHttp的API,试图使这两种情况下都能舒适使用。

当写请求头,用header(name, value)来为唯一出现的name设置value。如果它本身存在值,在添加新的value之前,他们会被移除。使用addHeader(name, value)来添加头部不需要移除当前存在的headers

当读取响应头,用header(name)返回最后设置name的value。如果没有valueheader(name)将返回null。可以使用headers(name)来读取所有列表字段的值,。

要访问所有的头部,用Headers类,它支持索引访问。

 private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://api.github.com/repos/square/okhttp/issues")
        .header("User-Agent", "OkHttp Headers.java")
        .addHeader("Accept", "application/json; q=0.5")
        .addHeader("Accept", "application/vnd.github.v3+json")
        .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    System.out.println("Server: " + response.header("Server"));
    System.out.println("Date: " + response.header("Date"));
    System.out.println("Vary: " + response.headers("Vary"));
  }

OkHttpClient   httpClient=new OkHttpClient();

在创建不同的httpClient方法实现不同的操作;详细请查看:

https://blog.csdn.net/jackingzheng/article/details/51778793#

 

关注公众号,回复c+兴趣的东西  24小时内即可领取学习。2T资料任君挑选!

posted @ 2018-05-25 14:53  逝年的我们  阅读(6468)  评论(0编辑  收藏  举报