情景引入
码农甲:这okhttp里面的方法到底什么乱七八糟的?什么Request,什么Post,我意思都不知道我还怎么用它啊卧槽。
HTTP:超文本传输协议
理解:这个经常出现在浏览器地址栏的到底是个啥?为什么需要这样一个协议?
假设一台计算机就是一个人,并且拥有各自的口音,那么他们能正常交流吗?广东人用“粤语”能和说“闽南语”的福建人交流吗?不能。不过假使广东人和福建人都说“普通话”那么他们不就能正常地交换信息了嘛。
HTTP协议是计算机信息交换的重要协议之一,如果所有计算机都遵从这个协议,那么它们就有正常进行交流的重要基础了。SO,这协议规定了些什么呢?

可以看到一次HTTP请求分为三个部分:请求行,请求头,请求主体。
A.请求行中写明了最重要的几个规范它包含如下三点。
1.请求方法:你想去和其他计算机达成信息交换,首先你得告诉计算机你这次是想拿数据还是传数据还是别的啥吧?图中方式名为POST,显而易见,这次我是想去提交一些东西。
2.请求地址:好了,计算机知道你要提交数据了,但是它还不知道你要往哪里提交,你得告诉它目标地址吧。图中的请求目标地址为百度。
3.请求协议:请求意愿和请求地址有了,可是计算机还不知道你要用什么交流标准去做这个事情呢,你是要跟目标计算机讲鸟语还是讲人话呢?图中的传输协议为HTTP/1.1。
B.到请求头了,这其中包含若干更细致的规范:例如这次你要跟我用鸟语讲多少字阿(Content-Length:123);这次你是想讲隔壁王二狗的八卦类事件还是讲村头托尼老师新给你做的发型(Content-Type:text/html)等若干以键值对(Key:Value)形式表示的详细规范。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||然后我们给一个空行表示请求行和请求头的信息已经配置完成,即将开始输入请求体中的具体字符了!||||||||||||||||||||||||||||||||||||||||||||||||||||
C.请求主体中包含着你实际想要发送的若干字符:"Hi福建人,我是广东人,我不会吃你的!"
好了,一个完整的http请求我们大概能理解了。图中包含的具体内容信息仅用来表明方式或格式,不一定是一次有效的请求。例如你无法通过POST方法让图中地址(www.baidu.com)接收你提交的数据。双手翻花.jpg
OK,下面我们来看看如何利用OKHTTP安排好一个完整的HTTP请求。
请求行的配置:
Request request = new Request.Builder(). //builder模式方便灵活配置
url(). //配置HTTP请求中的 目标地址
post(). //配置HTTP请求中的 请求方法
build(); //告诉程序你已经将本次HTTP请求的请求行相关要求大概配置完了
请求头的配置:
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8); //指定好你内容的格式。
(1).这里的"text/x-markdown"表明这些要传递的数据的大类(Type)为text
(2).小类(subType)为x-markdown
(3).这里的"charset=utf-8"指用的是utf-8的编码格式
总结起来就是这个MediaType类要你提前告知好数据的:(1.大类),(2.小类),(3.编码格式)。
请求主体的配置:
String requestBody = "福建人你好,我是广东人,我不会吃你的!"
你把本次HTTP请求的 (请求行),(请求头),(请求主体) 都写好了,那么接下来就把它们一并加入到之前声明好的“请求”中(Request类的对象request中)。
Request request = new Request().Builder(). //builder模式方便配置
url(www.pornhxb.com). //写好目标地址
post(RequestBody.create(mediaType,requestBody)). //这里RequestBody类的静态方法"create()",将 (请求头) 和 (请求主体) 包装在了一起
build(); //告知配置完成
整个HTTP请求我们已经通过Request类组装完成了!接下来就是把它发送出去了!
OkhttpClient okhttpClient = new OkhttpClient(); //声明一个OkhttpClient对象,里面封装了一些帮你安排好了某些东西
Call call = okhttpClient.newCall(request); //让你这个OkhttpClient对象去将request进一步处理成为一个可以真正执行的HTTP请求--Call
call.enqueue(new Callback{...}); //将这个包装好的完整的请求塞入队列中执行
网友评论