HTTP 协议

Table of Contents

1 HTTP

  • 基于 "请求" -> "响应" 机制的
  • 无状态的(服务器内心OS: 我不知道你是谁,你跟上一个请求是不是同一个,我真的不知道,我也不屑于知道。有什么好处?)
  • 明文传输的,基于文本的,不安全
  • 基于 TCP/IP 协议,OSI,网卡

事情的本质就是:

  1. 客户端,要发送某些数据到服务器 (request/parameter)
  2. 服务器,要发送某些数据到客户端 (response/html)

客户端请求,需要输入 url:

HTTP协议_服务器

 最主要的是,定义数据的传输格式(http 的报文):

HTTP协议_HTTP_02

HTTP协议_服务器_03

2 HTTP头部 (header)

请求头部:

  • User-Agent,使用的是什么浏览器
  • Host,使用哪个主机名进行的访问
  • Accept,我需要的是什么类型的数据,接受
  • Cache-Control,缓存的控制策略
  • Cookie

响应头部:

  • Content-Type,我返回的是什么类型的数据
  • Date
// 限制访问的 IP 地址
String host = req.getHeader("Host");
if (host != null && host.equals("127.0.0.1:8888")) {
    out.println("你不能直接使用 IP 地址去访问。");
    return;
}

// 限制访问的浏览器
// - 合理的变量名
// - 使用合理的 api
// - 空指针异常
// - 学会逻辑的抽离、封装
// - 写完代码,至少要验证一下正确性,即简单的测试
if (isiebrowser(req.getheader("user-agent"))) {
    out.println("不能使用ie浏览器!");
    return;
}

private boolean isiebrowser (string useragent) {
    if (useragent != null) {
        return useragent.contains("msie") || useragent.contains("trident");
    }
    return false;
}

3 请求方法 (methods)

带有一定的语义:

  • get,获取数据
  • post,更新数据
  • put,新增数据
  • delete,删除数据

比如,有一个 url: http://localhost:8888/w1/book

get    /w1/book  # 获取这本书的内容
post   /w1/book  # 用来更新某本书的内容
delete /w1/book  # 删除某本书
put    /w1/book  # 新增一本书

3.1 get

下面几种,进行的就是 get 请求:

  1. 在浏览器的地址栏中,输入 url 后,敲入回车
  2. 网页中的超链接 <a href="/kkkk.html">我是一个链接</a>
  3. 借助 <form> 表单,如果 method 为空或者为 get,那么默认就是进行一个 get 请求

携带的数据,叫参数(parameter)。

在 get 请求中,因为携带的数据比较少,所以,它推荐的方式是:

http://localhost:8888/w1/hhh?name=tom&age=18&city=zhuhai

3.2 post

下面几种,进行的就是 post 请求:

  1. 借助 <form method="post" action="/w1/bbb">

4 状态返回码 (status code)

常用返回码:

  • 200
  • 301
  • 404, Not Found, 没有找到
  • 500, Internal Server Error,内部的服务器错误