第一次学习:
https://blog.csdn.net/YULU5216/article/details/64563054
GET /?name=XXG&age=23 HTTP/1.1
Host: localhost:8081
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
POST / HTTP/1.1
Host: localhost:8081
Connection: keep-alive
Content-Length: 15
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
name=XXG&age=23
1、两个实验可以看出,GET和post参数所在请求数据中的位置不同,这才是GET和POST最基本的区别。
2、http请求一般包含三个部分
Request-Line
Header
<空行>
Message-Body[GET请求不包含Message-Body]
3、
(1)其中Request-Line,就是请求的第一行,例如上面的两个请求:
GET /?name=XXG&age=23 HTTP/1.1
POST / HTTP/1.1
它由三部分组成,请求Method(GET/POST/其他)、Request-URL、HTTP-version三个部分中间空格隔开。
(2)header就是传说中的请求头,键值对形式,每一条占一行,使用不同浏览器这部分的内容也不同。
(3)Message-Body是请求主体(注意并不是请求体),POST请求参数就在这一部分,它与Header之间必须要用空行隔开,这样服务器才能分清楚Header和Body。Message-Body的长度就是Header中的Content-Length。一般GET请求中是没有这一部分的。
上面POST请求中的参数就是Message-Body:
name=XXG&age=23
所以,如果再有人问GET请求和POST请求的区别,可以回答:
GET请求的参数在URL中,在请求的第一行Request-Line中,而POST请求的参数在请求主体Message-Body中
第二次学习:
https://blog.csdn.net/xiao__jia__jia/article/details/79357274
1、默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码。
urlencoded 翻译过来url encoded
2、由上可见,multipart/form-data将表单中的每个input转为了一个由boundary分割的小格式,没有转码,直接将utf8字节拼接到请求体中,在本地有多少字节实际就发送多少字节,极大提高了效率,适合传输长字节。
3、http/1.1 协议规定的http是以ASCII码传输,建立在TCP/IP协议之上的应用层规范
4、http请求分为三个部分:
<method> <request-URL> <version> <headers> <entity-body> |
5、协议规定POST提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的HTTP请求满足上面的格式就可以。
6、但是,数据发送出去,还要服务器解析成功才有意义。一般服务端语言如PHP、python等,以及它们的framework,都内置了自动解析常见数据格式的功能。服务端通常根据请求头(headers)中的Content-Type字段来获知请求主体是用何种方式编码,再对主体进行解析。
7、multipart/form-data
这是一个常见的POST数据提交的方式。我们使用表单上传文件时,必须让form的 enctyped 等于这个值.
8、上面提到的这两种POST数据的方式,都是浏览器原生支持的,而且现阶段原生form表单也支持这两种方式。
9、application/json这个content-type作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务器消息主体是序列化的json字符串。
10、序列化是将对象的状态信息转换为可以存储或传输的形式的过程。
11、text/xml
XML 作为编码方式的远程调用规范
第三次学习:
https://www.zhihu.com/question/64312188/answer/370779721
1、根据http的请求方法对应的数据传输能力把http请求分为url类请求和body类请求
2、body类请求,客户端可以通过body写出数据,服务器可以通过body接受数据,因为body类请求能上传到服务器的数据比url类请求的大得多。
3、body类请求在语义上和能力上来说应该是兼容url类请求的,body类请求除了可以把参数放到url中,也可以通过body发送数据。
4、例如当content-type是application/x-www-form-urllencoded时,客户端可以通过body发送键值对数据,例如key1=value1&key2=value2
5、例如当content_type是application/json时,客户端可以通过body发送json字符串,如果是application/xml时可以发送xmL字符串
6、例如当content-type是multipart/form-data时,客户端可以通过body发送一个表单。
第四次学习
https://blog.csdn.net/ght886/article/details/79089718
https://blog.csdn.net/baidu_36649389/article/details/79977547
1、所谓表单,就是以类似XML格式传输,字段放入XML中
2、 当method为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
当method为post时候,浏览器把form数据封装到http body中,然后发送到server(服务器)。
这两句话在AFNetworking里的提现是:
if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
if (query) {
mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]];
}
} else {
// #2864: an empty string is a valid x-www-form-urlencoded payload
if (!query) {
query = @"";
}
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
[mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
}
[mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]];
}
self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil];
3、enctype 的意思是加密类型
4、Post提交方式,form表单有两种enctype类型
(1)enctype = “application/x-www-form-urlencode”
也是默认的提交类型,一般针对文本请求参数,不含附件。比如
<form action="user/login.do" method="post" >
用户名:<input type="text" name="username"><br>
密码:<input type="text" name="password"><br>
<input type="submit" value="登录"/>
</form>
注意,这里面并没有enctype=”application/x-www-form-urlencoded”,因为默认就是这个类型呢
(2)enctype=“multipart/form-data”
需要上传附件时,必须为“multipart/form-data”比如
<form action=“user/login.do”> method=“post” enctype=“multipart/form-data”>
用户名:<input type=“text” name=“userName”><br>
密码:<input type=“text” name=“password”><br>
上传文件:<input type=“file” name=“uploadFile”/><br>
<input type=“submit” value=“登录”/>
</form>
请求消息头中, Content-Type: multipart/form-data; boundary=- - - -WebKitFormBoundarykALcKBgBaI9xA79y
boundary为分隔符.
消息体中的每个参数都会以“- -”+boundary 隔开,最后一个分隔符末尾需要加”- -“,即”- -“+boundary+”- -“
第五次学习:
http基础文章
https://www.runoob.com/http/http-header-fields.html
1、http基础
2、接下来把问题记录下来 继续研究
(1)比如gizp是什么,下面三点点来自百度百科
https://baike.baidu.com/item/gzip/4487553?fr=aladdin
1、gzip用于UNIX系统的文件压缩。我们在linux中经常会遇到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
2、http协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的web站点常常使用GZIP压缩技术来让用户感受更快的速度。
3、这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。
第5次学习
学习文章:
https://blog.csdn.net/zjkC050818/article/details/78799386
1、幂等性:HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用
2、幂等性是分布式系统设计中十分重要的概念,而HTTP的分布式本质也决定了它在HTTP中具有重要地位。