网络基础->HTTP
1.请求报文格式
/***
* GET /user HTTP/1.1 -------------------请求行
* Host:api.github.com -------------------Heads
* Content-Type:text/plain -------------------Heads
* Content-Length:400 -------------------Heads
*/
GET:请求方法,对应get、post、deleted方法;
/user:文件路径,如果使用了代理服务器,那么文件路径就是全路径api.github.com/user,数据发送到代理服务器以后会解析头信息,然后请求转到具体的服务;
HTTP/1.1:HTTP协议,1.1是版本;
api.github.com:服务器地址;
Content-Type:请求报文类型;
Content-Length:请求报文长度,单位字节;
2.响应报文格式
/***
* HTTP/1.1 200 OK -------------------状态行
* Content-Type:application/json -------------------Heads
* 21234567 -------------------Body
*/
HTTP/1.1:HTTP协议,1.1是版本;
200 :Status Code 响应码,表示正常,OK表示状态信息;
Content-Type:响应报文类型,json;
3.请求方法(GET、POST、PUT、DELETED)
GET
顾名思义,获取某个资源,请求报文如下,常用在获取用户列表等,一般是没有Body的;
/***
* GET /userList HTTP/1.1
*/
POST
顾名思义,上报增加或修改某个资源,请求报文如下,常用在增加或修改用户信息等,一般是带Body;
/***
* POST /user/1 HTTP/1.1
* age=18 //Body信息,将user年龄修改成18
*/
PUT
顾名思义,上报修改某个资源,请求报文跟POST类似,常用在修改用户信息等,一般是带Body;
DELETED
顾名思义,删除修改某个资源,请求报文跟GET类似,常用在删除某个用户等,一般是不带Body;
Tips:以上说的都是规范用法,返回Restful,但是很多公司只有一种,例如无论是获取信息还是修改新,都统统使用GET,我们公司就是这样,这样用也没什么影响,只是不太规范而已。
4.Status Code
1xx:临时性信息,例如客户端询问服务端是否支持HTTP 2,如果服务端支持,则返回101,不只支持,则返回200;
2xx:成功信息;
3xx:重定向,例如请求A地址,但是地址已经失效,重定向到B地址,客户端自动请求B地址,重定向对应客户来说的无感的;
4xx:客户端错误,客户端请求引起的错误,例如未登陆、参数异常;
5xx:服务端错误;
5.Heads(Host、Status Code、Content-Type、Content-Length、Location)
Heads是对数据的描述,是数据的属性,数据的数据;
Host:请求域名,不过不是用来寻址的,因为在发送报文之前,地址就已经通过DNS查询到了,host是用来对应虚拟主机,因为一个ip主机对应多个虚拟主机(网站);
Content-Length:请求内容长度,对应二进制内容来说,长度可以用来标识内容结束;
Content-Type:请求内容类型;
(1)text/html,html文件,常用在响应,浏览器可以解析json,所以用作区分;
(2)application/x-www-form-urlencoded:纯文本普通表单,不包含二进制,常用在请求,对应Retrofit的FormUrlEncoded,一般跟POST、Field搭配使用,Field表示参数为username=rengwuxian&gender=male,跟GET不同的是,参数是body里面,Path跟GET搭配使用
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=rengwuxian&gender=male
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String
gender);
(3) multitype/form-data,含二进制的表达,常用在请求;
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MA4YWxkTrZu0gW//是分隔符
Content-Length: 2382
------WebKitFormBoundary7MA4YWxkTrZu0gW//是分隔符
Content-Disposition: form-data; name="name"//第一组参数name=rengwuxian
rengwuxian
------WebKitFormBoundary7MA4YWxkTrZu0gW//是分隔符
Content-Disposition: form-data; name="avatar"; filename="avatar.jpg"//第二组参数图片
Content-Type: image/jpeg
JFIFHHvOwX9jximQrWa......
@Multipart
@POST("/users")
Call<User> addUser(@Part("name") RequestBody name, @Part("avatar")
RequestBody avatar);
(4) application/json,单项json内容
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"name":"rengwuxian","gender":"male"}
//请求
@POST("/users")
Call<User> addUser(@Body("user") User user);
//响应
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-length: 234
[{"login":"mojombo","id":1,"node_id":"MDQ6VXNl
cjE=","avatar_url":"https://avatars0.githubuse
rcontent.com/u/1?v=4","gravat......
(5) image/jpeg纯图片
POST /user/1/avatar HTTP/1.1
Host: hencoder.com
Content-Type: image/jpeg
Content-Length: 1575
JFIFHH9......
@POST("users/{id}/avatar")
Call<User> updateAvatar(@Path("id") String id, @Body RequestBody avatar);
...
RequestBody avatarBody = RequestBody.create(MediaType.parse("image/jpeg"),
avatarFile);
api.updateAvatar(id, avatarBody)
HTTP/1.1 200 OK
content-type: image/jpeg
content-length: 1575
JFIFHH9......
Location:重定向的地址;
User-Agent:用户代理,是服务器能识别客户端的操作系统(Android、IOS、WEB)及相关的信息。
Rang/Accept-Rang:指定Body的内容范围,例如目的服务器支持分段传输,断点续传或者分段下载(迅雷)
Cache-Control:no-cache(服务器告诉服务器可以缓存,都会每次请求都要跟服务交互一下,判断资源是否失效了),no-store(不能缓存,每次都得请求服务器),max-age(在这失效日期之前都可以用缓存)
Last-Modified:服务器告诉客户端数据最后修改时间,下次客户端想利用缓存,就可以以此来询问服务器,在这时间之后,数据是否发生了变化,服务器返回没有,那么就可以使用缓存,在是Cache-Control为no-cache时使用。
REST
客户端-服务器架构、无状态、可缓存、分层架构;
Restful HTTP
该用get就用get,该用post就用post,不混用,遵循规范,那就是Restful HTTP。
http 1.0缺点:
缺点:每个TCP连接只能发送一个请求,而新建TCP连接的成本很高,导致Http/1.0新能很差。
http 1.1
优点:a. TCP链接默认不关闭,可被多个请求复用;b. 引入管道机制,可以同一个TCP连接中同时发送多个请求,不过服务器还是按顺序响应。c. 在头部加入Content-Length字段,用来区分多个请求的内容;c.在头信息增加Host来指定服务器域名,可以访问一台服务器上的不同网站。
缺点:TCP连接中的响应有顺序,服务器处理完一个回应才能处理下一个回应,如果某个回应特别慢,后面的请求就会排队等待。