Retrofit2本身并不是一个很复杂的第三方库(至少从使用上是如此的)。那么像我一样知道点nodejs,又想学学Retrofit2的人来说,为了各种尝试,很可能自己搭建个restapi的服务器,然后在AS上实验Retrofit2。下面是我的采坑记录
无法访问localhost或者127.0.0.1
这是因为我们的安卓虚拟机给占用了,要用映射访问 把localhost改成10.0.2.2即可, 如:.baseUrl("http://10.0.2.2:3412/")
post的json body总是为空
这个纯属自己对notejs只是了解一丢丢,对http又不愿意详细了解导致的。我想传一个json格式的body给服务器解析,但服务器实际想要的不是json格式,而是类似(a1=1&a2=2)这样的,对于我的情况,修改测试服务器一行代码即可:
app.use(bodyParser.urlencoded({ extended: true }));
改成
app.use(bodyParser.json({ extended: true }));
如果用非json格式的body就要自己拼写,Retrofit2似乎没有提供这种参数的自动转换,不过也很好转换,比如我们的bean类是
data class Quote(val author:String, val text:String )
加一个导出函数就行了
data class Quote(val author:String, val text:String )
{
fun getRequestBody():RequestBody
{
return RequestBody.create(
MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"),
"author=$author&text=$text"
)
}
}
@POST("quote")
fun addQuote(@Body body:RequestBody):Call<ResponseBody>
fun addQuote(quote:Quote){
httpCaller.addQuote(quote.getRequestBody()).enqueue(object : Callback<ResponseBody?> {
override fun onResponse(
call: Call<ResponseBody?>,
response: Response<ResponseBody?>
) {
Log.d("zrm", response.body().toString())
}
override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
Log.e("zrm", t.message)
}
})
}