使用GSON的Volley自定义发帖请求

时间:2018-07-19 02:38:39

标签: android kotlin android-volley

我对排球是陌生的,我只是想问一下如何POSTGSON发出请求。

在此处遵循本教程:Volley custom request

这是我的对象类。

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)
}

这是本教程提供的代码,但我没有使用GET,而是将其更改为POST,并在其中添加了一些JSONObject,以提供BODY

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))
        }
    }
}

这就是我执行doRequest()时得到的。

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"
  }
}

在请求POST时,我是否错过了某些内容或者我的代码确实是错误的?帮帮我,谢谢!

1 个答案:

答案 0 :(得分:1)

我不会对你说谎,我更喜欢翻新而不是凌空抽烟。但是,我确实有这种偏爱的理由。首先,Retrofit旨在简化RESTful Web服务的使用,而Volley的目标是专门满足Android的所有网络需求。其次,与Volley相比,Retrofit易于使用。一般的Android开发人员可能需要Volley来解决问题,因为它需要一定的经验。最后是响应时间。

  • 3个字段的Retrofit POST平均花费14毫秒。
  • 具有3个字段的排球原生POST平均花费18ms。

我建议您使用Retrofit请求POST。此处是使用Retrofit的POST方法的教程

  1. Tutorial 1
  2. Tutorial 2