好的,各位看官,欢迎来到“Swoole Http Request/Response 对象奇妙夜”!🌙🌃
今天,咱们不搞那些枯燥的理论,而是用一种轻松愉快的方式,来扒一扒 Swoole 中这两个至关重要的对象:Http Request 和 Http Response。它们就像一对形影不离的舞伴,在 Web 应用的舞台上,演绎着数据交互的华尔兹。💃🕺
准备好了吗?让我们系好安全带,一起踏上这段充满惊喜的探索之旅吧!🚀
一、前言:何为 Request/Response?
在 Web 世界里,Request(请求)和 Response(响应)是永恒的主题。它们就像打电话时,你拨号发起呼叫(Request),对方接听并回应(Response)。没有 Request,服务器就不知道你要干啥;没有 Response,你就不知道服务器完成了什么。
- Request: 客户端(比如浏览器)发给服务器的指令,包含了客户端想要做什么,需要什么数据,以及客户端自身的一些信息。
- Response: 服务器接收到 Request 后,经过处理,返回给客户端的数据。包含了请求的结果、服务器的状态,以及服务器想要告诉客户端的一些信息。
想象一下,你走进一家餐厅,这就是一个 Request。你向服务员点菜,这就是 Request 的具体内容。服务员把菜端上来,这就是 Response。你狼吞虎咽地吃完,这就是 Response 的处理。😋
二、Swoole Http Request:客户端的密语
Swoole 的 SwooleHttpRequest
对象,就是客户端 Request 的化身。它像一个百宝箱,装满了客户端发来的各种信息。
-
$request->header
:头部的秘密HTTP 头部(Header)就像信封上的邮戳,包含了关于请求的元数据。
$request->header
是一个数组,存储了所有的 HTTP 头部信息。头部字段 含义 例子 User-Agent
客户端的身份标识,告诉服务器客户端是什么浏览器、操作系统等。 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
Content-Type
请求体的类型,告诉服务器请求体是什么格式的数据。 application/json
,text/html
,multipart/form-data
Accept
客户端能接受的响应类型,告诉服务器客户端希望接收什么格式的数据。 text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Cookie
客户端存储的 Cookie 信息,用于保持会话状态。 PHPSESSID=abcdefg1234567890
Host
请求的主机名,告诉服务器请求的是哪个网站。 www.example.com
你可以通过
$request->header['user-agent']
来获取客户端的 User-Agent,通过$request->header['content-type']
获取请求体的类型,以此类推。小贴士: Header 的键名是不区分大小写的,但 Swoole 会将其转换为小写。
-
$request->server
:服务器的耳语$request->server
包含了服务器的一些信息,比如请求的方法、URI、查询字符串等。字段 含义 例子 request_method
请求方法,比如 GET
、POST
、PUT
、DELETE
等。GET
,POST
request_uri
请求的 URI,包含了路径和查询字符串。 /path/to/resource?param1=value1
path_info
请求的路径信息,不包含查询字符串。 /path/to/resource
query_string
查询字符串,也就是 ?
后面的部分。param1=value1¶m2=value2
remote_addr
客户端的 IP 地址。 127.0.0.1
remote_port
客户端的端口号。 12345
你可以通过
$request->server['request_method']
获取请求方法,通过$request->server['request_uri']
获取请求的 URI。注意:
$request->server
中的键名都是大写的。 -
$request->get
和$request->post
:GET 和 POST 的秘密花园$request->get
存储了 GET 请求的参数,也就是 URL 中?
后面的参数。$request->post
存储了 POST 请求的参数,也就是请求体中的参数。
你可以通过
$request->get['param1']
获取 GET 请求中param1
的值,通过$request->post['param2']
获取 POST 请求中param2
的值。温馨提示: 如果请求方法是 GET,但请求体中也有数据,Swoole 不会自动解析,你需要手动处理。
-
$request->files
:文件的秘密通道如果请求中包含了文件上传,
$request->files
就会存储上传的文件信息。每个上传的文件都是一个数组,包含了以下信息:
字段 含义 name
原始文件名。 type
文件类型(MIME 类型)。 tmp_name
临时文件的路径。 error
错误代码, 0
表示上传成功。size
文件大小(字节)。 你需要使用
move_uploaded_file()
函数将临时文件移动到你想要保存的位置。重要提示: 为了安全起见,一定要对上传的文件进行验证,比如检查文件类型、大小等。
-
$request->cookie
:甜蜜的饼干$request->cookie
存储了客户端发送的 Cookie 信息。你可以通过$request->cookie['cookie_name']
获取 Cookie 的值。Cookie 就像客户端存储在本地的一小段数据,服务器可以通过 Cookie 来识别用户,保持会话状态。
-
$request->rawContent()
:原始数据的真相有时候,你需要获取请求的原始数据,比如 JSON 数据、XML 数据等。
$request->rawContent()
可以返回请求的原始数据。友情提示: 获取原始数据后,你需要自己进行解析。
三、Swoole Http Response:服务器的低语
Swoole 的 SwooleHttpResponse
对象,就是服务器 Response 的化身。它负责将服务器的处理结果发送给客户端。
-
$response->header()
:头部的声明你可以使用
$response->header()
方法来设置 HTTP 头部。$response->header('Content-Type', 'application/json'); $response->header('Cache-Control', 'no-cache');
注意: 必须在发送内容之前设置头部。
-
$response->cookie()
:种下甜蜜的种子你可以使用
$response->cookie()
方法来设置 Cookie。$response->cookie('username', 'johndoe', time() + 3600, '/', 'example.com', false, true);
参数说明:
$name
: Cookie 的名称。$value
: Cookie 的值。$expires
: Cookie 的过期时间,Unix 时间戳。$path
: Cookie 的有效路径。$domain
: Cookie 的有效域名。$secure
: 是否只在 HTTPS 连接中发送 Cookie。$httponly
: 是否禁止客户端脚本访问 Cookie。
-
$response->status()
:状态的宣告你可以使用
$response->status()
方法来设置 HTTP 状态码。$response->status(200); // OK $response->status(404); // Not Found $response->status(500); // Internal Server Error
HTTP 状态码是服务器告诉客户端请求处理结果的一种方式。
-
$response->write()
:书写内容你可以使用
$response->write()
方法来写入响应内容。$response->write('Hello, world!'); $response->write('<br>'); $response->write('This is a Swoole HTTP server.');
重要提示: 可以多次调用
$response->write()
方法,Swoole 会将所有内容拼接起来发送给客户端。 -
$response->end()
:画上句号你必须调用
$response->end()
方法来结束响应,并将所有内容发送给客户端。$response->end();
注意: 在调用
$response->end()
方法之后,就不能再写入任何内容了。 -
$response->sendfile()
:传送文件的魔法你可以使用
$response->sendfile()
方法来发送文件。$response->sendfile('/path/to/file.jpg');
优点: 效率高,避免了将文件内容读取到内存中再发送。
-
$response->redirect()
:指引方向你可以使用
$response->redirect()
方法来重定向到另一个 URL。$response->redirect('/new/location');
原理: 服务器会发送一个
302 Found
状态码和一个Location
头部,告诉客户端跳转到新的 URL。
四、实例演示:Request/Response 的完美邂逅
<?php
$http = new SwooleHttpServer("0.0.0.0", 9501);
$http->on("request", function ($request, $response) {
// 获取 GET 参数
$name = $request->get['name'] ?? 'Guest';
// 设置 Cookie
$response->cookie("X-ID", "123456789", time() + 3600);
// 设置头部
$response->header("Content-Type", "text/html; charset=utf-8");
// 写入内容
$response->write("<h1>Hello, " . htmlspecialchars($name) . "!</h1>");
$response->write("<p>Your User-Agent is: " . htmlspecialchars($request->header['user-agent']) . "</p>");
$response->write("<p>Your IP is: " . $request->server['remote_addr'] . "</p>");
// 检查是否上传了文件
if (isset($request->files['avatar'])) {
$file = $request->files['avatar'];
if ($file['error'] === 0) {
$filename = '/tmp/' . uniqid() . '_' . $file['name'];
if (move_uploaded_file($file['tmp_name'], $filename)) {
$response->write("<p>File uploaded to: " . htmlspecialchars($filename) . "</p>");
} else {
$response->write("<p>Failed to move uploaded file.</p>");
}
} else {
$response->write("<p>File upload error: " . $file['error'] . "</p>");
}
}
// 结束响应
$response->end();
});
$http->start();
代码解析:
- 创建一个 Swoole HTTP 服务器,监听
0.0.0.0:9501
。 - 监听
request
事件,当有新的请求到来时,执行回调函数。 - 从
$request->get
中获取name
参数,如果没有,则默认为Guest
。 - 使用
$response->cookie()
设置一个名为X-ID
的 Cookie。 - 使用
$response->header()
设置响应的 Content-Type。 - 使用
$response->write()
写入 HTML 内容,包括欢迎信息、User-Agent 和 IP 地址。 - 检查是否有文件上传,如果有,则将文件保存到
/tmp
目录下。 - 使用
$response->end()
结束响应。
运行结果:
在浏览器中访问 http://localhost:9501/?name=Swoole
,你将会看到类似下面的页面:
<h1>Hello, Swoole!</h1>
<p>Your User-Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...</p>
<p>Your IP is: 127.0.0.1</p>
五、总结:Request/Response 的艺术
通过今天的学习,我们深入了解了 Swoole 的 SwooleHttpRequest
和 SwooleHttpResponse
对象。它们是 Web 应用的基石,掌握它们,你就能构建出更高效、更强大的 Web 应用。
记住,Request 和 Response 就像一对默契的舞伴,只有彼此配合,才能跳出最美的舞蹈。💃🕺
希望今天的分享对你有所帮助!下次再见!👋