前言
OKHTTP 介绍
HTTP é a maneira como a rede de aplicações modernas. É como trocamos dados e mídia. > Fazer HTTP com eficiência torna suas coisas carregarem mais rápido e salva a largura de banda.
Okhttp é um cliente HTTP que é eficiente por padrão:
O suporte HTTP/2 permite que todas as solicitações do mesmo host compartilhem um soquete.
O pool de conexões reduz a latência da solicitação (se http/2 não estiver disponível).
Transparente GZIP encolher tamanhos de download.
O cache de resposta evita completamente a rede para solicitações de repetição.
Okhttp perseve quando a rede é problemática: ele se recuperará silenciosamente de problemas de conexão comuns. Se o seu serviço tiver vários endereços IP Okhttp> tentará endereços alternativos se o primeiro Connect falhar. Isso é necessário para IPv4+IPv6> e para serviços hospedados em data centers redundantes. O Okhttp inicia novas conexões> com os recursos modernos do TLS (SNI, ALPN) e volta ao TLS 1.0 se o aperto de mão falhar.Usar okhttp é fácil. Sua API de solicitação/resposta é projetada com construtores fluentes e imutabilidade. Ele suporta chamadas de bloqueio síncrono e chamadas assíncronas com retornos de chamada.
Okhttp suporta Android 2.3 e acima. Para Java, o requisito mínimo é 1,7. ― 摘自 https://square.github.io/okhttp/
特点
1. 支持 http 和 https 协议, api 相同, 易用;
2.http 使用线程池, https 使用多路复用;
3.OKHTTP 支持同步和异步调用;
4. Formulário 支持普通 Formulário;
5. 提供了拦截器, 操作请求和响应 (日志, 请求头, corpo 等);
6.Okhttp 可以设置缓存;
准备工作
在 pom.xml 文件中增加以下依赖
<Depencency> <voundid> com.squareup.okhttp3 </groupid> <TRATIFACTID> OKHTTP </ArtifactId> <versão> 3.6.0 </versão </dependency>
书写配置类
用 @configuration 注解该类 , 等价与 xml 中配置 feijão ;用 @bean 标注方法等价于 xml 中配置 Bean。
@ConfigurationPublic Classe okhttpConfiguration {@Bean public x509TrustManager x509TrustManager () {return X509TrustManager () {@Override public void CheckClientTrusted (x509Certificate [] x509Crertificates, String S) Sonets checkServerTrusted (x509Certificate [] x509Certificates, strings s) lança certificadoException {} @Override public x509Certificate [] getCeptEdissuers () {retorna novo x509Certificate [0]; }}; } @Bean public SSLSocketFactory SSLSocketFactory () {try {// 信任任何链接 sslContext sslContext = sslContext.getInstance ("tls"); sslContext.init (null, new TrustManager [] {x509TrustManager ()}, new SecureRandom ()); return sslContext.getSocketFactory (); } catch (nosuchalgorithMexception e) {e.printStackTrace (); } catch (keymanagementException e) {e.printStackTrace (); } retornar nulo; } /*** Crie um novo pool de conexão com parâmetros de ajuste apropriados para um aplicativo de usuário único. * Os parâmetros de ajuste neste pool estão sujeitos a alterações nas futuras versões do OKHTTP. Atualmente */ @Bean Public ConnectionPool Pool () {return new Connectionpool (200, 5, timeUnit.minutes); } @Bean public okhttpclient okhttpclient () {return new okhttpclient.builder () .sslsocketfactory (sslsocketfactory (), x509trustManager () .retryOnconnectionFailure (false) //onTeTELTETOL (). .readTimeout (10L, TimeUnit.Seconds) .Build (); }}工具类
自己写的工具类 , 比较简单 , 不是 Rest 风格
@ComPonenPublic Classe Okhttputil {private Static Final Logger Logger = LoggerFactory.getLogger (okhttputil.class); @Resource Private OkhttpClient OkhttpClient; / ** * Get * * @param url 请求的 url * @param consultas 请求的参数 , 在浏览器?后面的数据 , 没有可以传 null * @return */ public string get (string url, map <string, string> consultas) {string ResponseBody = ""; StringBuffer sb = new StringBuffer (URL); if (consultas! = null && Queries.KeySet (). size ()> 0) {boolean FirstFlag = true; Iterator iterator = Queries.entrySet (). Iterator (); while (iterator.hasNext ()) {map.entry Entry = (map.entry <string, string>) iterator.next (); if (FirstFlag) {sb.append ("?" + entradas.getKey () + "=" + entradas.getValue ()); FirstFlag = false; } else {sb.append ("&" + entradas.getKey () + "=" + entradas.getValue ()); }}} Request request = new request .builder () .url (sb.toString ()) .build (); Resposta resposta = nulo; tente {resposta = okhttpclient.newcall (request) .execute (); int status = resposta.code (); if (status == 200) {return Response.body (). String (); }} catch (Exceção e) {Logger.error ("Okhttp Put Error >> ex = {}", excepcionutils.getStackTrace (e)); } finalmente {if (resposta! = null) {Response.close (); }} retornar a resposta de resposta; } / ** * post * * @param url 请求的 url * @param params post formulário 提交的参数 * @return * / public string post (string url, map <string, string> params) {string ResponseBody = ""; Formbody.Builder Builder = new Formbody.builder (); // 添加参数 if (params! = Null && params.keySet (). Size ()> 0) {for (string key: params.keySet ()) {builder.add (key, params.get (key)); }} Request request = new request .builder () .url (url) .post (builder.build ()) .build (); Resposta resposta = nulo; tente {resposta = okhttpclient.newcall (request) .execute (); int status = resposta.code (); if (status == 200) {return Response.body (). String (); }} catch (Exceção e) {Logger.error ("Okhttp Post Error >> ex = {}", excepcionutils.getStackTrace (e)); } finalmente {if (resposta! = null) {Response.close (); }} retornar a resposta de resposta; } / ** * POST 上传文件 * * @param url * @param params * @param filetype * @return * / public string postFile (string url, map <string, objeto> params, string fileType) {string ResponseBody = ""; Multipartbody.builder Builder = new Multipartbody.builder (); // 添加参数 if (params! = Null && params.keyset (). Size ()> 0) {for (string key: params.keySet ()) {if (params.get (key) instanceof file) {file file = (arquivo) params.get (key); builder.addformDatapart (key, file.getName (), requestbody.create (mediatype.parse (fileType), arquivo)); continuar; } builder.addformDatapart (key, params.get (key) .toString ()); }} Request request = new request .builder () .url (url) .post (builder.build ()) .build (); Resposta resposta = nulo; tente {resposta = okhttpclient.newcall (request) .execute (); int status = resposta.code (); if (status == 200) {return Response.body (). String (); }} catch (Exceção e) {Logger.error ("Okhttp PostFile Error >> ex = {}", excepcionutils.getStackTrace (e)); } finalmente {if (resposta! = null) {Response.close (); }} retornar a resposta de resposta; }}使用方法
@ResourcePrivate okhttputIl okhttputil;
总结
以上就是这篇文章的全部内容了 , 希望本文的内容对大家的学习或者工作具有一定的参考学习价值 , 如果有疑问大家可以留言交流 , 谢谢大家对武林网的支持。