HTTP备忘

通信协议——HTTP

协议版本

HTTP/0.9

HTTP的1991原型版本称为HTTP/0.9。此协议有很多严重的设计缺陷,只应与很老的客户端交互,只支持GET方法,不支持多媒体内容等。

HTTP/1.0

1.0是第一个得到广泛使用的HTTP版本。新增了版本号、各种HTTP头部、新的请求方法(POST、PUT等)以及对多媒体对象的处理。

HTTP/1.0+

在1.0的基础上增加了一些特性,包括持久的keep-alive链接、虚拟主机支持、代理连接支持等,非官方标准。

HTTP/1.1

1.1校正了HTTP设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性,是当前主流的版本。

HTTP/2.0

2.0是1.1的升级。它重点关注性能的大幅优化,以及更强的服务逻辑远程执行。目前谷歌的一些RPC框架(GRPC)就是基于2.0开发的,相信2.0会慢慢普及。

资源

MIME类型

HTTP给每种通过web传输的对象都打上名为MIME类型的数据格式标签。MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初是为了解决在不同电子邮件系统间搬移报文时存在的问题。HTTP用它来描述并标记多媒体内容。

浏览器从服务器取对象时,会查看MIME类型,看是否它知道如何处理这个对象。MIME类型表示一种主要的对象类型和一个特定的子类型,两者通过斜杠分隔。比如:text/html、text/plain、image/jpeg等。

URI

每个web服务器资源都有一个名字URI(Uniform Resource Identifier,统一资源标识符)。其中URI又分为URL(Uniform Resource Location,统一资源定位符)和URN(Uniform Resource Name,统一资源名)。

URL

URL是资源标识符最常见的形式。它明确说明从一个精确、固定位置获取资源。

http://      www.example.com    /users/1

通信协议      主机地址         资源名称

URN

URI的第二种形式。URN作为特定内容的唯一名称,与资源所在地无关,可以将资源四处搬移。例如:urn:ietf:rfc:2141。不过URN仍处于试验阶段,期待以后大量的应用。

HTTP报文

请求方法

GET

GET是最常用的请求方法,用于请求服务器发送某个资源。

HEAD

HEAD与GET类似,但服务器在响应中只返回首部,不返回主体部分。HEAD允许在未获取实际资源的情况下,对资源首部进行分析,可以做到以下几点:

  1. 在不获取资源的情况下了解资源情况(如判断资源类型)
  2. 通过首部响应码判断资源是否存在
  3. 通过首部字段判断资源是否被修改

PUT

与GET从服务器读取资源相反,PUT会向服务器写入资源。

POST

POST一般用于表单提交,将数据推给服务器,然后由服务器进行数据处理。

TRACE

客户端发起的请求有可能会经过防火墙、代理、网关等,这其中每个节点都可能修改原始的HTTP请求,TRACE方法就允许客户端在最终将请求发送给服务器时,查看其状态。TRACE主要用来验证请求是否如愿穿过了请求响应链,查看代理和其他应用对用户请求所产生的效果 。

OPTIONS

OPTIONS方法请求web服务器告知其支持的各种功能,比如询问服务器支持的HTTP方法,或者对某些特殊资源支持哪些方法。

DELETE

DELETE用于请求服务器删除请求URL指定的资源。

扩展方法

HTTP被设计成字段可扩展的。下面是一些扩展的方法:

  1. LOCK:锁定资源
  2. MKCOL:创建资源
  3. COPY:复制资源
  4. MOVE:移动资源

状态码

HTTP状态码被分成了五个大类。下面一一介绍。

100~199

100~199属于信息性状态码。

状态码   描述短语 含义

100       Continue 表示收到了请求的初始部分,请客户端继续

101   Switching Protocols 表示服务器根据客户端指定将协议换成update首部协议

200~299

200~299属于成功性状态码。

状态码   描述短语 含义

200       OK 请求没问题,返回主体中包含了所请求的资源

201   Created 创建服务器对象的请求,如PUT

202       Accepted 请求已被接受,但服务器还未执行任何动作

203   Non-Authoritative Information 实体首部信息不是来源服务器,而是资源的副本

204   No Content 响应报文包含若干个首部和状态,但无实体部分

205   Reset Content 告知浏览器清除当前页面所有HTML表单元素

206       Partial Content 成功执行了一个部分或服务请求

300~399

300~399属于重定向状态码。重定向状态码要么告知客户端用替代位置访问他们感兴趣的资源,要么提供一个替代的响应而不是资源的内容。

状态码   描述短语 含义

300       Multiple Choices 客户端请求一个实际指向多个资源的URL

301   Moved Permanently 请求的URL已被移除使用,并返回新URL  

302   Found 与301类似,返回临时URL,将来请求使用旧URL

303   See Other 告知客户端应用另一个URL来获取资源

304   Not Modified 表示资源最近未被修改

305       Use Proxy 说明必须通过代理访问资源

307   Temporary Redirect 与301类似

400~499

400~499属于客户端错误状态码。最常见的是请求一个不存在的URL。

状态码   描述短语 含义

400       Bad Request   用于告知客户端它发生了一个错误的请求

401       Unauthorized 未认证

402   Payment Required 目前未使用,备用

403   Forbidden 说明请求被服务器拒绝了

404   Not Found 说明服务器无法找到所请求的URL

405   Method Not Allowed 发起请求的方法不被服务器支持

406   Not Acceptable 说明服务器没有与客户端URL相匹配的资源

407   Proxy Authentication Required 与401类似,不过对象是代理服务器

408   Request Timeout 请求超时

409   Conflict 请求可能引发冲突

410   Cone 与404类似,不过表示服务器曾经有该资源

411   Length Required 服务器要求客户端请求报文包含Content-Length

412   Precondition Failed 客户端发起了条件请求,且其中一个条件失败了

413   Request Entity Too Large 请求的实体部分比服务器能够处理的大

414   Request URI Too Long 请求URI比服务能处理的长

415   Unsupported Media Type 服务器无法理解或支持客户端的Content-Type

416   Requested Range Not Satisfiable请求范围无效

417   Expectation Failed 请求的Expect包含一个期望,但服务器无法满足

500~599

500~599属于服务器错误状态码。客户端发起了有效请求,但服务器自身出错了。

状态码   描述短语 含义

500       Internal Server Error   服务器内部错误

501   Not Implemented 客户端发起的请求超出服务器能力范围

502   Bad Gateway 服务器代理出错

503   Service Unavailable 服务器现在无法为请求提供服务

504   Gateway Timeout 服务器网关超时

505   HTTP Version Not Supported 服务器收到了不支持HTTP协议的请求

头部

请求头和请求方法共同决定了客户端和服务器能做的事情。

通用头

客户端和服务器都可以使用的头部。比如Date头部,用于说明构建报文的时间和日期。

头部 描述

Connection 客户端与服务连接相关的设置

Date 说明报文是什么时间创建的

MIME-Version MIME版本

Trailer 报文采用分块传输编码方式,Trailer用于列出头部集合

Transfer-Encoding 报文的传输编码方式

Update 升级的版本或协议

Via 报文经过的中间节点(代理、网关等)

Cache-Control 报文传输的缓存指示

Pragma 另一种随报文传送指示的方式,但不专用于缓存

请求头

请求报文特有的头部。它们为服务器提供了一些额外信息,比如客户端希望接受什么类型的数据等。

头部 描述

Client-IP 客户端机器IP地址

From 客户端用户Email地址

Host 接受请求服务器的主机名和端口号

Referer 当前请求URL

UA-Color 与客户端显示器颜色相关的信息

UA-CPU 客户端CPU类型或制造商

UA-Disp 客户端显示器能力相关信息

UA-OS 客户端操作系统相关信息

UA-Pixels 客户端显示器像素信息

User-Agent 发起请求的应用程序名称

Accept 告诉服务器发送哪些媒体类型

Accept-Charset 告诉服务器能够发送哪些字符集

Accept-Encoding 告诉服务器能够发送哪些编码方式

Accept-Language 告诉服务器能够发送哪些语言

TE 告诉服务器可以使用哪些扩展传输编码

Expect 允许客户端列出某请求所要求的服务器行为

If-Match 如果实体标记与文档当前的实体标记匹配就获取

If-Modified-Since 获取的资源需要在指定的日期之后被修改过

If-None-Match 如果实体标记与当前文档实体标记不符,就获取

If-Range 允许对文档的某个范围进行条件请求

If-Unmodified-Since 获取的资源需要在指定的日期之后没有被修改过

Range 资源指定的范围

Authorization 包含了客户端供给服务端,以便对客户端进行认证的数据

Cookie 客户端发送给服务端的一个令牌

Cookie2 说明请求端支持的cookie版本

Max-Forward 通往服务器中,将请求转发给其他代理或网关的最大次数

Proxy-Authorization 代理认证

Proxy-Connection 代理连接方式

响应头

响应报文特有的头部。通常为客户端提供额外的信息。比如Server头部就用了告知客户端与什么服务器交互。

头部 描述

Age 响应持续时间

Public 服务器为其资源支持的请求方法列表

Retry-After 如果资源不可用,在此日期重试

Server 服务器应用程序软件的版本和名称

Title HTML文档的标题

Warning 详细的警告描述

Accept-Ranges 服务器可接受的范围类型

Vary 首部列表

Proxy-Authenticate 代理对客户端的质询列表

Set-Cookie 在客户端设置一个令牌,以便服务器对客户端标识

Set-Cookie2 与Set-Cookie类似

WWW-Authenticate 服务器对客户端的质询列表

实体头部

实体头部指的是用于实体主体的头部。比如用来说明实体主体部分的数据类型。

头部 描述

Allow     列出允许的请求方法

Location 告知客户端实体实际位置

Content-Base 解析实体中相对URL使用的基础URL

Content-Encoding 实体编码方式

Content-Language 实体报文语言

Content-Length 实体字节长度

Content-Location 资源实际位置

Content-MD5 实体的MD5摘要

Content-Range 实体字节范围

Content-Type 实体对象类型

ETag 实体标记

Expires 实体不再有效

Last-Modified 实体最后一次被修改日期和时间

扩展头部

扩展头部是非标准的头部,由开发者创建和处理。比如API认证等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抱歉,我作为一个语言模型并不能直接提供代码。不过,以下是一个简单的Android备忘录应用的代码框架,你可以参考一下: 1. activity_main.xml: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter your memo here" /> <Button android:id="@+id/addButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Add memo" /> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> ``` 2. Memo.java: ```java public class Memo { private String text; private Date date; public Memo(String text) { this.text = text; this.date = new Date(); } public String getText() { return text; } public Date getDate() { return date; } } ``` 3. MemoAdapter.java: ```java public class MemoAdapter extends ArrayAdapter<Memo> { private Context context; private int resource; public MemoAdapter(Context context, int resource, List<Memo> memos) { super(context, resource, memos); this.context = context; this.resource = resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { Memo memo = getItem(position); if (convertView == null) { convertView = LayoutInflater.from(context).inflate(resource, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); textView.setText(memo.getText()); TextView textView2 = convertView.findViewById(android.R.id.text2); textView2.setText(memo.getDate().toString()); return convertView; } } ``` 4. MainActivity.java: ```java public class MainActivity extends AppCompatActivity { private List<Memo> memos; private MemoAdapter memoAdapter; private EditText editText; private Button addButton; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.editText); addButton = findViewById(R.id.addButton); listView = findViewById(R.id.listView); memos = new ArrayList<>(); memoAdapter = new MemoAdapter(this, android.R.layout.simple_list_item_2, memos); listView.setAdapter(memoAdapter); addButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String text = editText.getText().toString().trim(); if (text.isEmpty()) { Toast.makeText(MainActivity.this, "Please enter a memo", Toast.LENGTH_SHORT).show(); return; } Memo memo = new Memo(text); memos.add(memo); memoAdapter.notifyDataSetChanged(); editText.setText(""); } }); } } ``` 这只是一个简单的备忘录应用程序的代码框架,您可以根据您的需要对其进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值