我对排球是陌生的,我只是想问一下如何POST
向GSON
发出请求。
在此处遵循本教程: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
时,我是否错过了某些内容或者我的代码确实是错误的?帮帮我,谢谢!
答案 0 :(得分:1)
我不会对你说谎,我更喜欢翻新而不是凌空抽烟。但是,我确实有这种偏爱的理由。首先,Retrofit旨在简化RESTful Web服务的使用,而Volley的目标是专门满足Android的所有网络需求。其次,与Volley相比,Retrofit易于使用。一般的Android开发人员可能需要Volley来解决问题,因为它需要一定的经验。最后是响应时间。
我建议您使用Retrofit请求POST。此处是使用Retrofit的POST方法的教程