Retrofit2本身并不是一個很復(fù)雜的第三方庫(至少從使用上是如此的)。那么像我一樣知道點nodejs,又想學(xué)學(xué)Retrofit2的人來說,為了各種嘗試灭翔,很可能自己搭建個restapi的服務(wù)器,然后在AS上實驗Retrofit2隐绵。下面是我的采坑記錄
無法訪問localhost或者127.0.0.1
這是因為我們的安卓虛擬機(jī)給占用了,要用映射訪問 把localhost改成10.0.2.2即可拙毫, 如:.baseUrl("http://10.0.2.2:3412/")
post的json body總是為空
這個純屬自己對notejs只是了解一丟丟依许,對http又不愿意詳細(xì)了解導(dǎo)致的。我想傳一個json格式的body給服務(wù)器解析缀蹄,但服務(wù)器實際想要的不是json格式峭跳,而是類似(a1=1&a2=2)這樣的,對于我的情況,修改測試服務(wù)器一行代碼即可:
app.use(bodyParser.urlencoded({ extended: true }));
改成
app.use(bodyParser.json({ extended: true }));
如果用非json格式的body就要自己拼寫缺前,Retrofit2似乎沒有提供這種參數(shù)的自動轉(zhuǎn)換蛀醉,不過也很好轉(zhuǎn)換,比如我們的bean類是
data class Quote(val author:String, val text:String )
加一個導(dǎo)出函數(shù)就行了
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)
}
})
}