如何在CRONET中将JSON对象作为发布请求发送?

Hari Shankar S:

我正在开发android应用程序,其中我现在使用cronet将数据发送到服务器,我想将数据发送到json对象中的服务器,但不知道如何发送对象?

以下是我的GET方法(WORKING)的代码段。

任何人都可以分享如何在android cronet中使用POST方法吗?

依存关系

 implementation 'org.chromium.net:cronet-embedded:71.3578.98'

主要活动

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import org.chromium.net.CronetEngine
import java.util.concurrent.Executors

class MainActivity : AppCompatActivity() {

    companion object {
        // Web page url
        private const val JSON_PLACEHOLDER_API_URL = "https://jsonplaceholder.typicode.com/todos/1"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Build a Cronet engine
        val cronetEngine =
            CronetEngine.Builder(this)
                .enableBrotli(true)
                .build()

        // Build the request
        val request =
            cronetEngine.newUrlRequestBuilder(
                JSON_PLACEHOLDER_API_URL,
                RequestCallback(),
                Executors.newSingleThreadExecutor()
            ).build()

        // Start the request
        request.start()
    }
}

RequestCallback

import android.util.Log
import org.chromium.net.CronetException
import org.chromium.net.UrlRequest
import org.chromium.net.UrlResponseInfo
import java.nio.ByteBuffer
import java.nio.charset.Charset


/**
 * Different methods are invoked for different response status
 */

class RequestCallback : UrlRequest.Callback() {

    companion object {
        // Log cat tag
        private val TAG = RequestCallback::class.java.simpleName
    }

    override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) {
        Log.i(TAG, "Response Started")
        val statusCode = info?.httpStatusCode
        Log.i(TAG, "Status Code $statusCode")
        if (statusCode == 200) {
            // Read the buffer
            request?.read(ByteBuffer.allocateDirect(32 * 1024))
        }
    }

    override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) {
        Log.i(TAG, "Response Completed")

        // Flip the buffer
        byteBuffer?.flip()

        // Convert the byte buffer to a string
        byteBuffer?.let {
            val byteArray = ByteArray(it.remaining())
            it.get(byteArray)
            String(byteArray, Charset.forName("UTF-8"))
        }.apply {
            Log.d(TAG, "Response: $this")
        }

        // Clear the buffer
        byteBuffer?.clear()

        // Read the buffer
        request?.read(byteBuffer)
    }

    override fun onFailed(request: UrlRequest?, info: UrlResponseInfo?, error: CronetException?) {
        Log.e(TAG, "Response Failed: ${error?.message}")
    }

    override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) {
        Log.i(TAG, "Response Succeeded")
    }

    override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) {
        Log.i(TAG, "Response Redirect to $newLocationUrl")
        request?.followRedirect()
    }

    override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) {
        super.onCanceled(request, info)
        Log.i(TAG, "Response cancelled")
    }
}

输出量

Response: {
      "userId": 1,
      "id": 1,
      "title": "delectus aut autem",
      "completed": false
    }
Aissam Hidoussi:

例:

    val myBuilder = CronetEngine.Builder(context)
    // Enable caching of HTTP data and
    // other information like QUIC server information, HTTP/2 protocol and QUIC protocol.
    val cronetEngine: CronetEngine = myBuilder
        .enableHttpCache(CronetEngine.Builder.HTTP_CACHE_IN_MEMORY, 100 * 1024.toLong())
        .enableHttp2(true)
        .enableQuic(true)
        .build()
    val executor: Executor = Executors.newSingleThreadExecutor()
    val requestBuilder = cronetEngine.newUrlRequestBuilder(
        "FULL-URL",
        MyUrlRequestCallback(),
        executor
    )
    // Content-Type is required, removing it will cause Exception
    requestBuilder.addHeader("Content-Type","application/json; charset=UTF-8")
    requestBuilder.setHttpMethod("POST")
    val myUploadDataProvider = MyUploadDataProvider()
    requestBuilder.setUploadDataProvider(myUploadDataProvider,executor)
    val request: UrlRequest = requestBuilder.build()
    request.start()

MyUploadDataProvider类:

import android.util.Log
import org.chromium.net.UploadDataProvider
import org.chromium.net.UploadDataSink
import java.lang.Exception
import java.nio.ByteBuffer
import java.nio.charset.StandardCharsets

private const val TAG = "MyUploadDataProvider"
//TODO replace username and passowrd "_user & _pass"
var string: String ="{\"username\":\"_user\",\"password\":\"_pass\"}"
val charset = StandardCharsets.UTF_8

class MyUploadDataProvider() : UploadDataProvider() {

    override fun getLength(): Long {
    val size:Long = string.length.toLong()
    Log.e(TAG,"Length = "+size)
    return size
    }

    override fun rewind(uploadDataSink: UploadDataSink?) {
    Log.e(TAG,"REWIND IS CALLED")
    uploadDataSink!!.onRewindSucceeded()
    }

    override fun read(uploadDataSink: UploadDataSink?, byteBuffer: ByteBuffer?) {
    Log.e(TAG,"READ IS CALLED")
    byteBuffer!!.put(string.toByteArray(charset))
    //byteBuffer.rewind()
    //For chunked uploads, true if this is the final read. It must be false for non-chunked uploads.
    uploadDataSink!!.onReadSucceeded(false)
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Mockmvc中将模拟对象作为JSON发送

如何在CRONET中将JSON对象作为发布请求发送?

如何在GET调用中将地图作为请求参数发送

如何在BuzzBrowser帖子调用中将文件数据作为发布参数发送

如何在bash脚本中的curl中将多行json字符串作为主体发布

将JSON对象作为POST请求发送

发送JSON字符串作为发布请求

如何在Retrofit 2(Android)中将JSON对象作为参数发送

如何在cURL发布请求中发送简单对象

如何在排球中将JSON数组作为后期请求发送?

更新:如何使用http包在流星中将Json数据作为POST请求发送

如何在CURL POST命令中将JSON文件作为请求正文的一部分发送

如何在IONIC 3中将多个输入字段作为JSON对象发布到服务器

如何在WSK(Openwhisk)中将JSON对象作为参数传递

如何在Python中将JSON发布请求转换为DataFrame

如何在Android中发送发布请求

如何将传递对象作为参数发送到发布请求

如何在发布对象中将JsonPatchDocument作为属性传递?

如何在Java中将Date对象作为参数发送

如何在Rho :: AsyncHttp的post方法中将数据作为json对象发送

如何在Scala中将任何对象作为Json Writeable传递?

如何在HTTP请求中将JSON作为查询参数传递?

如何在Java中将复杂的JSON对象发布到cURL请求

如何在 POST 请求中将 textarea 值作为参数发送

如何在发布请求(Web 活动)Azure 数据工厂中将文件作为参数传递?

如何在获取请求中将 json 对象作为查询传递

如何在 React JS Axios 中将请求有效负载作为可选的 api 调用发送

如何在多部分表单 API 请求调用中将 json 字典作为字段发送?

如何在 Postman 中将文件作为请求参数的一部分发送