每天记录学习的新知识 :OKHTTP 过一遍请求
发布日期:2021-05-10 05:21:22 浏览次数:43 分类:精选文章

本文共 2815 字,大约阅读时间需要 9 分钟。

OKHttp 开发者指南

参考与转载

本文为个人学习参考材料,严禁转载请 الطبي要作者授权。如需分享,请注明出处并给予链接。

简介

Square公司出品,OKHttp 是一款开源的HTTP客户端框架,专为Android开发者打造,支持同步和异步请求,基于 Burlap 代理。

优势

  • 支持HTTP2/SPDY:如果SPDY不可用,通过连接池减少请求延时
  • 智能socket管理:自动选择最优路线,支持自动重连,减少握手次数
  • 缓存策略:基于Headers缓存,减少重复网络请求
  • Interceptors支持:轻松处理请求与响应(自动处理GZip压缩)
  • 网络问题处理:自动重试多个IP地址
  • 易用性:支持同步阻塞调用和异步调用的混合使用
  • 使用指南

    排他依赖

    在Android项目中添加OKHttp依赖:

    implementation 'com.squareup.okhttp3:okhttp:3.13.1'

    ###必需权限

    安装OKHttp

  • 打开项目属性
  • 进入依赖管理
  • 在搜索栏输入com.squareup.okhttp3:okhttp:3.13.1并点击入库
  • 按需创建OKHttpClient

    处理同步请求

    val call = OkHttpClient().newCall(request)  
    call.execute()

    异步请求

    val url = "http://example.com"  
    val okHttpClient = OkHttp()
    val request = Request.newBuilder()
    .url(url)
    .get()
    .build()
    val call = okHttpClient.newCall(request)
    call.enqueue(object : Callback{
    override fun onFailure(call: Call, exception: IOException) {
    // 处理失败
    }
    override fun onResponse(call: Call, response: Response
    ) {
    response.body?.string()?.let { content ->
    // 处理响应
    }
    }
    })

    发送Post请求

  • 创建RequestBody:

    val requestBody = RequestBody.create(  
    MediaType("application/json", "UTF-8"),
    gson.toJson(mapOf(
    "phone" to "15612345678",
    "password" to encodedPwd
    ))
    )
  • 使用中自定义请求头:

    val request = Request  
    .baseUrl("$baseUrl$DOMAIN1$LOGIN")
    .headers {
    add("time", System.currentTimeMillis().toString())
    add("requestId", UUID.randomUUID().toString().replace("-", ""))
    add("Content-Type", "application/json")
    add("charset", "UTF-8")
    add("Accept", "application/json")
    }
    .post(requestBody)
    .build()
  • Retrofit与OKHttp结合使用

    在Retrofit中,Post 请求可以如图使用:

    @POST("$DOMAIN1$LOGIN")  
    fun login(@Body map: Map
    ): Observable

    发送文件

    val file = File("路径")  
    val requestBody = RequestBody.create(
    MediaType("multipart/form-data"),
    file
    )

    取多个参数

    val part1 = Headers.of("Content-Disposition", "form-data; name=\"title\"")  
    val fileBody = RequestBody.create(null, "Square Logo")
    val part2 = Headers.of("Content-Disposition", "form-data; name=\"image\"")
    val imageBody = RequestBody.create(
    MediaType("image/png"),
    File("图片路径")
    )
    val multipartBody = MultipartBodyBuilder()
    .setType(MultipartBody.FORM)
    .addPart(part1, fileBody)
    .addPart(part2, imageBody)
    .build()

    媒体类型支持

    // 图片支持类型:  
    MediaType.IMAGE_PNG = "image/png"
    MediaType.IMAGE_JPEG = "image/jpeg"
    MediaType.IMAGE_BMP = "image/bmp"

    文件传输

    .addFormDataPart("file", "file.jpg", RequestBody.create(MediaType("image/png"), file))

    Retrofit中多参数上传

    @Multipart  
    @POST("$DOMAIN2/c/file/update")
    fun updatePic(
    @PartMap params: Map
    ): Observable

    注意事项

  • 错误处理:谨慎处理IOException
  • 防止内存泄漏:关闭response.body()
  • 异步回调:https://square.github.io/okhttp/docs/3.x/faq---- Geçti.xyz
  • 通过以上指南,您可以快速掌握如何使用OKHttp和Retrofit完成各种HTTP请求,同时优化网络性能。

    上一篇:每天记录学习的新知识 :OKHTTP的拦截器了解下
    下一篇:每天记录学习的新知识:调试异常(待续)

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月12日 16时42分54秒