Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用GSON截击自定义Post请求_Android_Kotlin_Android Volley - Fatal编程技术网

Android 使用GSON截击自定义Post请求

Android 使用GSON截击自定义Post请求,android,kotlin,android-volley,Android,Kotlin,Android Volley,我是截击新手,我只想问一下如何使用GSON发布请求 以下是本教程: 这是我的对象类 class Account { @SerializedName("status") var status: String? = null @SerializedName("token") var token: String? = null @SerializedName("user") var user: AccountInfo? = null } clas

我是截击新手,我只想问一下如何使用
GSON
发布
请求

以下是本教程:

这是我的对象类

class Account {
    @SerializedName("status")
    var status: String? = null

    @SerializedName("token")
    var token: String? = null

    @SerializedName("user")
    var user:  AccountInfo? = null
}

class AccountInfo(val id: Int, val username: String, val password: String)
这是我的请求函数

private fun doRequest() {
    val url = "http://www.xxxwebportalxxx.com/api/user/login/"
    val queue = Volley.newRequestQueue(this)

    val jsonObject = JSONObject()
    jsonObject.put("username", "user@gmail.com")
    jsonObject.put("password", "123456xxx")

    val hashMap = HashMap<String, String>()
    hashMap["public-key"] = "0123456789qwertyuiop"
    hashMap["Content-Type"] = "application/x-www-form-urlencoded"

    val gsonRequest = GsonRequest(url, Account::class.java, hashMap, jsonObject,
            Response.Listener { response ->
                Log.i("response", "$response")
            },
            Response.ErrorListener {

            }
    )
    queue.add(gsonRequest)
}
这就是我在执行
doRequest()
时得到的结果


在请求发布
帖子时,我是否遗漏了什么或我的代码真的错了?帮帮我,伙计们,谢谢

我不会骗你,我更喜欢改装而不是截击。然而,我有我的理由选择这个。首先,改造的目的是使使用RESTful web服务变得更容易,而Volley的目标是专门处理Android的所有网络需求。其次,与凌空相比,改装更易于使用。一般Android开发者可能会遇到截击的问题,因为它需要一些经验来掌握。最后,响应时间

  • 3个字段的改装柱平均耗时14毫秒
  • 有3个字段的截击本地帖子平均耗时18毫秒
我建议你使用改装来申请职位。这里是关于您的POST改装方法的教程


  • 谢谢你的建议。我将阅读教程链接。@JasurKurbanov所以你更喜欢改装而不是截击;)感谢您的评论您确定
    application/x-www-form-urlencoded
    是正确的内容类型吗?因为你的身体是一个JSON,所以我把
    application/JSON
    。也许这就是你的问题所在,内容类型是
    application/x-www-form-urlencoded
    我应该做些什么更改吗?如果你正在实现任何类型的web客户端-安装调试代理。您将确切地看到设备输出的内容以及响应中返回的内容。然后很容易将其与文档进行比较。我使用的是Charles proxy,但您可以使用mitm甚至stetho。@dotGitignore这取决于Web服务的期望。可能它同时接受这两种内容类型,但如果将JSON放在内容类型为
    application/x-www-form-urlencoded
    的位置,服务器可能无法正确解析JSON
    class GsonRequest<T>(
            url: String,
            private val clazz: Class<T>,
            private val headers: MutableMap<String, String>?,
            private val data: JSONObject,
            private val listener: Response.Listener<T>,
            errorListener: Response.ErrorListener
    ) : Request<T>(Method.POST, url, errorListener) {
        private val gson = Gson()
    
        override fun getBody(): ByteArray {
            return gson.toJson(data).toByteArray()
        }
    
        override fun getHeaders(): MutableMap<String, String> = headers ?: super.getHeaders()
    
        override fun deliverResponse(response: T) = listener.onResponse(response)
    
        override fun parseNetworkResponse(response: NetworkResponse?): Response<T> {
            return try {
                val json = String(
                        response?.data ?: ByteArray(0),
                        Charset.forName(HttpHeaderParser.parseCharset(response?.headers)))
                Response.success(
                        gson.fromJson(json, clazz),
                        HttpHeaderParser.parseCacheHeaders(response))
            } catch (e: UnsupportedEncodingException) {
                Response.error(ParseError(e))
            } catch (e: JsonSyntaxException) {
                Response.error(ParseError(e))
            }
        }
    }
    
    D/NetworkSecurityConfig: No Network Security Config specified, using platform default
    D/Volley: [320] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://www.xxxwebportalxxx.com/api/user/login/ 0xc0da6ea6 NORMAL 1> [lifetime=6043], [size=16], [rc=401], [retryCount=1]
    E/Volley: [298] BasicNetwork.performRequest: Unexpected response code 401 for http://www.xxxwebportalxxx.com/api/user/login/
    
    { 
      "status" : true,
      "token" : "fake-token-generated",
      "user":  {
        "id": "1",
        "username": "user@gmail.com",
        "password": "123456xxx"
      }
    }