Amadeus复刻计划(App篇 六)

前言:尝试性的加入了http请求模块,暂时还未想到放在哪里,但遇到的一些问题烦恼了许久,有记录下来的必要。
Q1: java如何发送http请求(get,post)?
A1:网上查到的参考资料显示,被广泛使用的方法有java官方的HttpURLConnection与第三方库Okhttp,尝试了下前者,比较倾向于底层,没有进行封装,使用起来比较麻烦,因为笔者并没有在java领域深究的打算,因此决定使用okhttp(需要使用gradle安装依赖)
Q2:Okhttp在java中的大致使用流程是什么?
A2:okhttp发送post请求的流程大致如下(get很简单就不做赘述了)
1. 创建OkHttpClient对象(OkHttpClient client = new OkHttpClient();)
2. 构造FormBody用以传输表单数据(FormBody payload = new FormBody.Builder()
.add("action", "FY_BY_REALTlME")
.build();其中add函数传表单的键值对)
3. 构建Request对象,将FormBody作为Post方法的参数传入(Request request = new Request.Builder()
.header("Referer", "https://fanyi.youdao.com/")
.post(payload)
.url(url)
.build();其中header函数传请求头相关数据,同样是键值对形式)
4. 封装成Call并执行(Call call = client.newCall(request);Response response = call.execute();返回值为Response类型)
Q3:okhttp返回的结果是什么形式?该怎么处理成需要的数据类型?
A3:okhttp的请求结果以Response类型数据返回,说实话笔者对其也不是很了解,但摸索得出的结论是,response.body 属性返回了我们所需要的响应数据(即F12中拿到的响应)
根据响应结果的不同,可以使用response.body().string();获取字符串数据,或是response.body().byteStream();获取二进制流数据,拿到数据后对其怎么处理就与okhttp没有关系了,这里不多做记录。
Q3:请求负载(payload)与表单数据(formdata)在okhttp中有什么区别?
A3:这个是一个很令人困惑的问题,因为在python的requests库中似乎对其进行了处理,在此之前笔者从未意识到这两个竟然是不一样的。于是在java中就翻了车,返回数据和预期不符。
在翻查了很久后(主要是不知道该如何描述问题),暂时的结论是payload是以json的数据形式发送给服务器的。因此不能使用A2中构建FormBody的形式传输(其实FormBody这个名字也提示了哇……),直接摆出结论代码:
MediaType mediaType=MediaType.Companion.parse("application/json;charset=utf-8")
RequestBody requestBody=RequestBody.Companion.create(String.valueOf(json),mediaType);
其中第一行是固定的,似乎是指明将要传输的数据为json类型
第二行中的RequestBody是FormBody的父类,即formbody只是其中一个特殊情况,需要注意的是,构建RequestBody时需要将构造的json数据转为字符串(感觉很离谱,但它确实是这么干的),之后的操作就和传form一样了。
ps:感觉思路卡壳了(毕竟之前都是复刻嘛,没啥创新)
参考资料:
https://cloud.tencent.com/developer/article/1910477
https://blog.csdn.net/qq_19306415/article/details/102954712
交流群:
723240586