【实战】OKhttp通过POST提交json数据,打印请求用的拦截器

作者:DCTANT

写作背景:网上到处都是用OKhttp配合Retrofit使用Json通过POST提交数据,但是拦截器一个都没有, 坑得要死,还有一篇介绍POST请求用的拦截器的,结果用了发现对json POST数据来说一点用处没有。

为了与时俱进,代码全是用Kotlin写的,毕竟OKhttp4.0也是用Kotlin写的了(觉得不爽来打我啊!O(∩_∩)O哈哈~),主要参考

HttpLoggingInterceptor写的,不然根本写不出来,毕竟RequestBody打断点,能看得见content,就是拿不出来,看得见摸不着,费了我好长时间,最后发现源码中的HTTPLoggingInterceptor用requestBody.writeTo就解决了这个问题,后悔当时没早点看源码。

下面上代码:

import okhttp3.Interceptor
import okhttp3.Response
import okio.Buffer
import java.nio.charset.Charset
import java.util.concurrent.TimeUnit
class PostInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response? {
        val request = chain.request()
        //打印请求起始信息
        val requestStartMsg = "--> ${request.method()} ${request.url()} ${request.body()?.contentLength()}-byte body"
        println(requestStartMsg)
        request.body()?.also { requestBody ->
            val bodyString = "Content-Type: ${requestBody.contentType()} Content-Length: ${requestBody.contentLength()}"
            println(bodyString)
        }
        val requestHeaders = request.headers()
        val size = requestHeaders.size()
        //打印请求头信息
        for (i in 0 until size) {
            val name = requestHeaders.name(i)
            if (!"Content-Type".equals(name, true) && !"Content-Length".equals(name, true)) {
                println("${name} : ${requestHeaders.value(i)}")
            }
        }
        val requestBody = request.body()
        val buffer = Buffer()
        //将请求体内容写入buffer中
        requestBody?.writeTo(buffer)
        println()
        //打印整个请求体中的内容(这步全靠打断点找出来的)
        println(buffer.readByteString().utf8())
        println("--> END ${request.method()} (${requestBody?.contentLength()}-byte body)")

        val startNs = System.nanoTime()
        //执行请求
        val response = chain.proceed(request)
        //计算耗时
        val tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs)
        requestBody?.also { requestBody ->
            //请求完成后打印请求信息
            val bodyInfo = "<-- ${response.code()} ${response.message()} ${response.request().url()} (${tookMs} ms) Content-Length ${requestBody.contentLength()}"
            println(bodyInfo)
        } ?: also {
            println("No request body found!!")
        }
        val responseHeaders = response.headers()
        //打印Response头中的信息
        for (i in 0 until requestHeaders.size()) {
            println("${responseHeaders.name(i)} : ${responseHeaders.value(i)}")
        }
        response.body()?.also { responseBody ->
            val source = responseBody.source()
            source.request(Long.MAX_VALUE)
            val sourceBuffer = source.buffer()
            //打印Response中的内容(如果直接用responseBody.string()会导致流关闭而报错!java.lang.IllegalStateException: closed)
            println(sourceBuffer.clone().readString(Charset.defaultCharset()))
            println("<-- END HTTP (${sourceBuffer.size()} -byte body)")
        } ?: also {
            println("<-- END HTTP No response body found!")
        }
        return response
    }
}

使用:OKhttpClient.Builder()的时候addInterceptor中new 一个PostInterceptor即可

使用效果:

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用OkHttp3可以通过POST请求发送JSON数据。需要将JSON数据转化为RequestBody,然后通过Request.Builder来构建请求对象,最后使用OkHttpClient发送请求即可。具体实现方法可以参考OkHttp3的官方文档或者相关的教程资料。 ### 回答2: OkHttp是一种流行的HTTP客户端库,用于在Android应用程序中处理http请求json是一种轻量级的数据交换格式,常用于web应用程序间的数据传输。 在Android中使用OkHttp3发送post请求,包括以下几个步骤: 1.在Android Studio的build.gradle(Module:app)中添加以下依赖项: ``` implementation 'com.squareup.okhttp3:okhttp:3.12.0' ``` 2.在需要发送post请求的Activity的java文件中,导入以下包: ``` import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; ``` 3.在需要发送post请求的Activity中添加以下代码,其中JSON_DATA_STRING为要发送的Json格式数据: ``` public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(JSON, JSON_DATA_STRING); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); ``` 在上述代码中,首先创建了一个OkHttpClient对象,用于构建请求、发送请求并接收响应。使用RequestBody对象将需要发送的Json数据设置到HTTP 请求Body中。Request.Builder()是用来构建一个HTTP请求的实例,参数url为请求的地址,HTTPRequest的类型为POST请求Header中包含JSON数据和Content-Type,然后将RequestBody对象信息设置到请求对象中。 构造完成后,调用client.newCall(request).execute()来发送请求并获取响应信息。需要注意的是,由于Android 是基于Linux内核编译的,如果在主线程中执行网络请求,容易造成网络等待导致系统反应迟缓或出现 ANR(App Not Responding)异常,因此网络请求必须在子线程中执行。 以上就是使用OkHttp3对Android应用程序中的Json数据进行post请求的完整过程。开发者可以根据自己的需求进行相应的修改和调整。 ### 回答3: OkHttp是一个流行的HTTP客户端,用于与后端API进行通信。Post请求是向后端API传递数据的常见方式之一。本文将介绍如何使用OkHttp3进行Post请求并传输json数据。 首先,我们需要在项目中添加OkHttp3依赖,可以在Gradle文件中添加以下行: ```gradle implementation 'com.squareup.okhttp3:okhttp:4.9.2' ``` 接下来,我们需要创建一个OkHttpClient对象: ```kotlin val client = OkHttpClient() ``` 创建一个RequestBody对象,并将json字符串作为参数传入: ```kotlin val json = "{ \"name\": \"张三\", \"age\": 28 }" val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json) ``` 然后创建一个Request对象,将RequestBody对象添加到请求中: ```kotlin val request = Request.Builder() .url("https://example.com/api/user") .post(body) .build() ``` 这里设置了请求的url和method为'post',并将之前创建的RequestBody对象添加到请求中。接下来,使用OkHttpClient对象来发送请求: ```kotlin client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 处理请求失败的情况 } override fun onResponse(call: Call, response: Response) { // 处理请求成功的情况 val result = response.body()?.string() // 获取响应的数据 } }) ``` 使用newCall方法创建一个Call对象,并使用enqueue方法将回调函数添加到请求中。回调函数包含两个方法:onFailure和onResponse。如果请求失败,onFailure方法将被调用,并将异常作为参数传递给它。如果请求成功,onResponse方法将被调用,并将响应作为参数传递给它。我们可以通过调用响应对象的body()方法来获取响应的数据。 到此为止,我们已经完成了使用OkHttp3进行Post请求并传输json数据的过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值