前言
okhttp 介绍
HTTP เป็นวิธีที่เครือข่ายแอพพลิเคชั่นที่ทันสมัย มันเป็นวิธีที่เราแลกเปลี่ยนข้อมูลและสื่อ > การทำ HTTP อย่างมีประสิทธิภาพทำให้สิ่งของของคุณโหลดได้เร็วขึ้นและประหยัดแบนด์วิดท์
Okhttp เป็นไคลเอนต์ HTTP ที่มีประสิทธิภาพโดยค่าเริ่มต้น:
การสนับสนุน HTTP/2 อนุญาตให้คำขอทั้งหมดไปยังโฮสต์เดียวกันแชร์ซ็อกเก็ต
การรวมการเชื่อมต่อลดการร้องขอเวลาแฝง (หาก HTTP/2 ไม่พร้อมใช้งาน)
GZIP หดตัวโปร่งใสขนาดดาวน์โหลด
การแคชการตอบสนองหลีกเลี่ยงเครือข่ายอย่างสมบูรณ์สำหรับการร้องขอซ้ำ
Okhttp มีความพยายามเมื่อเครือข่ายมีปัญหา: มันจะกู้คืนได้อย่างเงียบ ๆ จาก >> ปัญหาการเชื่อมต่อทั่วไป หากบริการของคุณมีที่อยู่ IP หลายที่ Okhttp จะ> ลองใช้ที่อยู่อื่นหากการเชื่อมต่อครั้งแรกล้มเหลว สิ่งนี้จำเป็นสำหรับ IPv4+IPv6> และสำหรับบริการที่โฮสต์ในศูนย์ข้อมูลซ้ำซ้อน Okhttp เริ่มต้นการเชื่อมต่อใหม่> ด้วยคุณสมบัติ TLS ที่ทันสมัย (SNI, ALPN) และกลับไปที่ TLS 1.0 หากการจับมือล้มเหลวการใช้ Okhttp นั้นง่าย API คำขอ/การตอบสนองได้รับการออกแบบมาพร้อมกับผู้สร้างที่คล่องแคล่วและไม่สามารถเปลี่ยนแปลงได้ รองรับทั้งการโทรบล็อกแบบซิงโครนัสและการโทร Async ด้วยการโทรกลับ
Okhttp รองรับ Android 2.3 ขึ้นไป สำหรับ Java ข้อกำหนดขั้นต่ำคือ 1.7 - https://square.github.io/okhttp/
特点
1. 支持 http 和 https 协议, api 相同, 易用;
2.HTTP 使用线程池, https 使用多路复用;
3.Okhttp 支持同步和异步调用;
4. 支持普通แบบฟอร์ม和文件上传แบบฟอร์ม;
5. 提供了拦截器, 操作请求和响应 (日志, 请求头, ร่างกาย等);
6.Okhttp 可以设置缓存;
准备工作
在 pom.xml 文件中增加以下依赖
<Effercing> <roupId> com.squareup.okhttp3 </groupId> <ratifactId> okhttp </artifactid> <cersion> 3.6.0 </version> </derness>
书写配置类
用 @configuration 注解该类, 等价与 xml 中配置ถั่ว ;用 @bean 标注方法等价于 xml 中配置ถั่ว。
@ConfigurationPublic คลาส okhttpconfiguration {@bean สาธารณะ x509trustManager x509trustManager () {ส่งคืนใหม่ x509trustManager () {@Override โมฆะ public CheckClientTrusted (x509Certificate [] x509certificates checkserverTrusted (x509Certificate [] x509Certificates, สตริง s) พ่นใบรับรองการรับรู้ {} @Override สาธารณะ x509Certificate [] getacceptedissuers () {ส่งคืน x509certificate ใหม่ [0]; - } @Bean สาธารณะ SSLSocketFactory SSLSocketFactory () {ลอง {// 信任任何链接 sslContext sslContext = sslContext.getInstance ("tls"); sslContext.init (null, ใหม่ TrustManager [] {x509trustManager ()}, ใหม่ securerandom ()); ส่งคืน sslContext.getSocketFactory (); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } catch (keyManagementException e) {e.printStackTrace (); } return null; } /*** สร้างพูลการเชื่อมต่อใหม่พร้อมพารามิเตอร์การปรับแต่งที่เหมาะสมสำหรับแอปพลิเคชันผู้ใช้คนเดียว * พารามิเตอร์การปรับจูนในพูลนี้อาจมีการเปลี่ยนแปลงในการเปิดตัว OKHTTP ในอนาคต ปัจจุบัน */ @Bean Public ConnectionPool Pool () {ส่งคืน New ConnectionPool (200, 5, TimeUnit.minutes); } @Bean สาธารณะ okhttpClient okhttpClient () {ส่งคืนใหม่ okhttpclient.builder () .sslsocketfactory (sslsocketfactory (), x509trustManager (). TimeUnit.Seconds) .ReadTimeOut (10L, TimeUnit.seconds) .build (); -工具类
自己写的工具类, 比较简单, 不是พักผ่อน风格
@ComponentPublic คลาส okhttputil {ส่วนตัว logger สุดท้าย logger = loggerFactory.getLogger (okhttputil.class); @Resource Private OkhttpClient okhttpClient; / ** * รับ * * @param url 请求的 url * @param Queries 请求的参数, 在浏览器?后面的数据, 没有可以传 null * @return */ สตริงสาธารณะรับ (string url, แผนที่ <สตริง, สตริง> แบบสอบถาม) {สตริงตอบกลับ = ""; StringBuffer SB = ใหม่ StringBuffer (URL); if (แบบสอบถาม! = null && queries.keyset (). size ()> 0) {boolean firstflag = true; Iterator Iterator = Queries.entrySet (). iterator (); ในขณะที่ (iterator.hasnext ()) {map.entry entry = (map.entry <string, string>) iterator.next (); if (firstFlag) {sb.append ("?" + entry.getKey () + "=" + entry.getValue ()); firstFlag = false; } else {sb.append ("&" + entry.getKey () + "=" + entry.getValue ()); }}} คำขอคำขอ = คำขอใหม่. builder () .url (sb.toString ()) .build (); การตอบสนองการตอบสนอง = null; ลอง {response = okhttpClient.newCall (คำขอ) .Execute (); สถานะ int = response.code (); if (สถานะ == 200) {return response.body (). string (); }} catch (exception e) {logger.error ("Okhttp ใส่ข้อผิดพลาด >> ex = {}", excternutils.getStackTrace (e)); } ในที่สุด {ถ้า (ตอบกลับ! = null) {response.close (); }} return ResponseBody; } / ** * โพสต์ * * @param url 请求的 url * @param พารามิเตอร์โพสต์ฟอร์มฟอร์ม提交的参数 * @return * / โพสต์สตริงสาธารณะ (สตริง url, แผนที่ <สตริง, สตริง> พารามิเตอร์) {string responsebody = ""; formbody.builder builder = new formbody.builder (); // 添加参数 if (params! = null && params.keyset (). size ()> 0) {สำหรับ (คีย์สตริง: params.keyset ()) {builder.add (คีย์, params.get (คีย์)); }} คำขอคำขอ = คำขอใหม่. builder () .url (url) .post (builder.build ()) .build (); การตอบสนองการตอบสนอง = null; ลอง {response = okhttpClient.newCall (คำขอ) .Execute (); สถานะ int = response.code (); if (สถานะ == 200) {return response.body (). string (); }} catch (exception e) {logger.error ("ข้อผิดพลาดโพสต์ okhttp >> ex = {}", excternutils.getStackTrace (e)); } ในที่สุด {ถ้า (ตอบกลับ! = null) {response.close (); }} return ResponseBody; } / ** * โพสต์上传文件 * * @param url * @param params * @param fileType * @return * / สตริงสาธารณะ postfile (url สตริง, แผนที่ <สตริง, วัตถุ> พารามิเตอร์, สตริง fileType) {สตริงตอบกลับ = ""; multipartbody.builder builder = new multipartbody.builder (); // 添加参数 if (params! = null && params.keyset (). size ()> 0) {สำหรับ (คีย์สตริง: params.keyset ()) {ถ้า (params.get (key) ไฟล์อินสแตนซ์) {ไฟล์ไฟล์ = (ไฟล์) params.get (คีย์); builder.addformDatapart (คีย์, file.getName (), requestbody.create (mediaType.parse (fileType), ไฟล์)); ดำเนินการต่อ; } builder.addformDatapart (คีย์, params.get (คีย์) .toString ()); }} คำขอคำขอ = คำขอใหม่. builder () .url (url) .post (builder.build ()) .build (); การตอบสนองการตอบสนอง = null; ลอง {response = okhttpClient.newCall (คำขอ) .Execute (); สถานะ int = response.code (); if (สถานะ == 200) {return response.body (). string (); }} catch (exception e) {logger.error ("Okhttp postfile error >> ex = {}", excternutils.getStackTrace (e)); } ในที่สุด {ถ้า (ตอบกลับ! = null) {response.close (); }} return ResponseBody; -使用方法
@ResourcePrivate okhttputil okhttputil;
总结
以上就是这篇文章的全部内容了, 希望本文的内容对大家的学习或者工作具有一定的参考学习价值, 如果有疑问大家可以留言交流, 谢谢大家对武林网的支持。