Day2-HTTP

Day2-HTTP

SYuan03 Lv4

Day2-1 HTTP基础

为什么需要协议

  1. 明确的边界
  2. 信息解析
  3. (预留拓展)

HTTP最早版本

0.9

HTTP协议的最初版本是HTTP/0.9,它于1991年问世。这个版本非常简单,只支持无格式的文本数据传输,没有请求头、响应头等结构化信息。

HTTP/0.9的主要特点如下:

  1. 请求方式:只支持GET请求方法,即通过GET方法请求服务器上的资源。
  2. URL:只能包含请求的路径,没有主机名、端口号、查询参数等。
  3. 响应格式:服务器返回的响应只包含请求资源的纯文本内容,没有响应头、状态码等。
  4. 连接:每次请求都会关闭连接,无法保持持久连接。
  5. 内容类型:响应的内容类型默认为HTML。

HTTP协议里有什么

0.9到1.1的版本变化

状态码

  • 1xx(信息性状态码):表示请求已被接收,正在处理中。
    • 100 Continue:服务器已收到请求的初始部分,客户端应继续发送剩余部分。
    • 101 Switching Protocols:服务器已经理解请求,将切换到不同的协议进行通信。
  • 2xx(成功状态码):表示请求已成功处理。
    • 200 OK:请求成功,返回对应的资源。
    • 201 Created:请求已成功处理,并在服务器上创建了新资源。
    • 204 No Content:请求成功,但响应不包含实体主体内容。
  • 3xx(重定向状态码):表示需要进行进一步操作以完成请求。
    • 301 Moved Permanently:资源的URI已永久移动到新位置。
    • 302 Found:资源的URI已临时移动到新位置。
    • 304 Not Modified:客户端的缓存副本仍然有效,可以使用缓存的版本。
  • 4xx(客户端错误状态码):表示请求包含语法错误或无法完成请求。
    • 400 Bad Request:请求无效,服务器无法理解请求。
    • 401 Unauthorized:请求要求身份验证。
    • 404 Not Found:请求的资源不存在。
  • 5xx(服务器错误状态码):表示服务器在处理请求时发生错误。
    • 500 Internal Server Error:服务器遇到意外错误,无法完成请求。
    • 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应。

HTTP报文结构

1、请求行和响应行(状态行)

请求行:请求方法,url,HTTP版本

相应行:HTTP版本,状态码,状态描述

2、请求头和响应头

不止有图上这些

1.请求头

Accept:MIME 可选项,不一定有

指明了期望返回的类型

Host

请求头中的 “Host” 字段用于指定目标服务器的主机名或 IP 地址。它是 HTTP/1.1 协议中的一个必需字段,在发送请求时应该包含在请求头部中。

2.响应头

Content-Length

Content-Type

3、空行

4、请求体和响应体

Day2-2 Hertz 应用篇

hz和thriftgo

IDL Interface Definition Language

Hz实战1

hz 使用 (thrift) | CloudWeGo

创建hello.thrift文件

1
2
mkdir idl
vim hello.thrift

hello.thrift文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// idl/hello.thrift
namespace go nju.dsy.example
// 指明目标代码语言是go
// 命名空间是nju.dsy.example

struct HelloReq {
1: string Name (api.query="name");
// 添加 api 注解为方便进行参数绑定
}

struct HelloResp {
1: string RespBody;
}


service HelloService {
HelloResp HelloMethod(1: HelloReq request) (api.get="/hello");
}
1
2
hz new -module github.com/SYuan03/thrift/example -idl idl/hello.thrift
go mod tidy # 整理 & 拉取依赖

namespace里面就是对应的多级目录结构

执行go mod tidy后,爆红消失

修改 handler,添加自己的逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// handler path: biz/handler/hello/example/hello_service.go
// 其中 "hello/example" 是 thrift idl 的 namespace
// "hello_service.go" 是 thrift idl 中 service 的名字,所有 HelloService 定义的方法都会生成在这个文件中

// HelloMethod .
// @router /hello [GET]
func HelloMethod(ctx context.Context, c *app.RequestContext) {
var err error
var req example.HelloReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(400, err.Error())
return
}

resp := new(example.HelloResp)

// 你可以修改整个函数的逻辑,而不仅仅局限于当前模板
resp.RespBody = "hello," + req.Name // 添加的逻辑

c.JSON(200, resp)
}
1
2
3
4
go build
ls
./example
curl http://127.0.0.1:8888/hello?name=dsy -w "\n"

成功

Hz实战2

hz 使用 (thrift) | CloudWeGo

更新一个已有的项目

根据需求重写hello.thrift的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// idl/hello.thrift
namespace go nju.dsy.example
// 指明目标代码语言是go
// 命名空间是nju.dsy.example

struct GetStudentInfoReq {
1: i32 ID (api.query="id"); // 添加 api 注解为方便进行参数绑定
}

struct GetStudentInfoResp {
1: i32 ID;
2: string Name;
3: string Favorite;
}

struct PostStudentInfoReq {
1: i32 ID;
2: string Name;
3: string Favorite;
}

struct PostStudentInfoResp {
1: string RespBody;
}

service StudentService {
GetStudentInfoResp GetStudentInfoMethod(1: GetStudentInfoReq request) (api.get="/query");

PostStudentInfoResp PostStudentInfoMethod(1: PostStudentInfoReq request) (api.post="/add-student-info");
}

thrift的idl的结构体需要标序号,参数也要标序号,以指明顺序

int用不了,要用i32

执行

1
hz update -idl idl/hello.thrift

关于make

成功

post

1
curl http://127.0.0.1:8888/add-student-info -X POST -H 'Content-Type:application/json' -d '{"ID":666,"Name": "dsy", "Favorite": "peach"}' -w "\n"

get

1
curl http://127.0.0.1:8888/query?id=10 -w "\n"

Hz实战3

hz client 代码生成 | CloudWeGo

参考

hertz-examples/hz/hz_client at main · cloudwego/hertz-examples · GitHub

啥玩意?

  • IDL(Interface Definition Language):接口定义语言,用于定义分布式系统中服务接口的规范和格式。IDL 可以用于生成客户端和服务器端的代码,以便它们可以相互通信和交互数据。Thrift 和 gRPC 等框架都支持使用 IDL 进行服务定义和代码生成。

  • RPC(Remote Procedure Call):远程过程调用,是一种跨网络的分布式系统通信方式,允许客户端应用程序调用远程服务器上的过程或方法,并接收返回结果。RPC 可以使用 HTTP、TCP、UDP 等协议进行通信,常用的框架包括 Thrift、gRPC、Dubbo 等。

  • HTTP 请求:超文本传输协议(HTTP)定义了客户端和服务器之间的通信协议。HTTP 请求是客户端向服务器发送的请求,包括请求方法、URL、请求头、请求体等信息。服务器根据这些信息来处理请求,并返回响应结果。

  • Hertz client:Hertz 是一个开源的 RPC 框架,支持使用 IDL 进行服务定义和代码生成。Hertz client 是客户端程序,用于向 Hertz server 发送 RPC 请求,并接收响应结果。

  • Hertz server:Hertz server 是服务端程序,用于接收 Hertz client 发送的 RPC 请求,并处理请求,返回响应结果。

它提到了一种工具或框架,可以根据 IDL 文件生成客户端代码,并自动屏蔽创建和初始化 Hertz client 的繁琐操作。生成的客户端代码可以直接使用 HTTP 请求调用 Hertz server 提供的服务,并接收响应结果。使用这种工具或框架,可以大大简化分布式系统中的开发和调试过程,提高开发效率。

先把之前的idl搬过来

1
2
3
mkdir server
cd server
hz new -mod=github.com/SYuan03/thrift/example2 --idl=../idl/hello.thrift --handler_by_method -t=template=slim
1
2
3
# 同理,略
hz client -mod=github.com/SYuan03/thrift/client --idl=../idl/hello.thrift --model_dir=hertz_gen -t
=template=slim --client_dir=hz_client

成功!

  • 标题: Day2-HTTP
  • 作者: SYuan03
  • 创建于 : 2023-07-11 11:42:29
  • 更新于 : 2024-03-10 19:41:19
  • 链接: https://bblog.031105.xyz/posts/2023-Summer-Courses-CloudWeGo/day2-http.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论