Amadeus復(fù)刻計(jì)劃(App篇 六)

前言:嘗試性的加入了http請(qǐng)求模塊,暫時(shí)還未想到放在哪里,但遇到的一些問題煩惱了許久,有記錄下來的必要。
Q1: java如何發(fā)送http請(qǐng)求(get,post)?
A1:網(wǎng)上查到的參考資料顯示,被廣泛使用的方法有java官方的HttpURLConnection與第三方庫Okhttp,嘗試了下前者,比較傾向于底層,沒有進(jìn)行封裝,使用起來比較麻煩,因?yàn)楣P者并沒有在java領(lǐng)域深究的打算,因此決定使用okhttp(需要使用gradle安裝依賴)
Q2:Okhttp在java中的大致使用流程是什么?
A2:okhttp發(fā)送post請(qǐng)求的流程大致如下(get很簡(jiǎn)單就不做贅述了)
????1.????創(chuàng)建OkHttpClient對(duì)象(OkHttpClient client = new OkHttpClient();)
????2.????構(gòu)造FormBody用以傳輸表單數(shù)據(jù)(FormBody payload = new FormBody.Builder()
? ? ? ?.add("action", "FY_BY_REALTlME")
? ? ? ?.build();其中add函數(shù)傳表單的鍵值對(duì))
????3.????構(gòu)建Request對(duì)象,將FormBody作為Post方法的參數(shù)傳入(Request request = new Request.Builder()
? ? ? ?.header("Referer", "https://fanyi.youdao.com/")
? ? ? ?.post(payload)
? ? ? ?.url(url)
? ? ? ?.build();其中header函數(shù)傳請(qǐng)求頭相關(guān)數(shù)據(jù),同樣是鍵值對(duì)形式)
????4.? ? 封裝成Call并執(zhí)行(Call call = client.newCall(request);Response response = call.execute();返回值為Response類型)
Q3:okhttp返回的結(jié)果是什么形式?該怎么處理成需要的數(shù)據(jù)類型?
A3:okhttp的請(qǐng)求結(jié)果以Response類型數(shù)據(jù)返回,說實(shí)話筆者對(duì)其也不是很了解,但摸索得出的結(jié)論是,response.body 屬性返回了我們所需要的響應(yīng)數(shù)據(jù)(即F12中拿到的響應(yīng))
根據(jù)響應(yīng)結(jié)果的不同,可以使用response.body().string();獲取字符串?dāng)?shù)據(jù),或是response.body().byteStream();獲取二進(jìn)制流數(shù)據(jù),拿到數(shù)據(jù)后對(duì)其怎么處理就與okhttp沒有關(guān)系了,這里不多做記錄。
Q3:請(qǐng)求負(fù)載(payload)與表單數(shù)據(jù)(formdata)在okhttp中有什么區(qū)別?
A3:這個(gè)是一個(gè)很令人困惑的問題,因?yàn)樵趐ython的requests庫中似乎對(duì)其進(jìn)行了處理,在此之前筆者從未意識(shí)到這兩個(gè)竟然是不一樣的。于是在java中就翻了車,返回?cái)?shù)據(jù)和預(yù)期不符。
在翻查了很久后(主要是不知道該如何描述問題),暫時(shí)的結(jié)論是payload是以json的數(shù)據(jù)形式發(fā)送給服務(wù)器的。因此不能使用A2中構(gòu)建FormBody的形式傳輸(其實(shí)FormBody這個(gè)名字也提示了哇……),直接擺出結(jié)論代碼:
????MediaType mediaType=MediaType.Companion.parse("application/json;charset=utf-8")
RequestBody requestBody=RequestBody.Companion.create(String.valueOf(json),mediaType);
其中第一行是固定的,似乎是指明將要傳輸?shù)臄?shù)據(jù)為json類型
第二行中的RequestBody是FormBody的父類,即formbody只是其中一個(gè)特殊情況,需要注意的是,構(gòu)建RequestBody時(shí)需要將構(gòu)造的json數(shù)據(jù)轉(zhuǎn)為字符串(感覺很離譜,但它確實(shí)是這么干的),之后的操作就和傳form一樣了。
ps:感覺思路卡殼了(畢竟之前都是復(fù)刻嘛,沒啥創(chuàng)新)
參考資料:
https://cloud.tencent.com/developer/article/1910477
https://blog.csdn.net/qq_19306415/article/details/102954712
交流群:
723240586