Swoole Http Request/Response对象详解

好的,各位看官,欢迎来到“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 的化身。它像一个百宝箱,装满了客户端发来的各种信息。

  1. $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 会将其转换为小写。

  2. $request->server:服务器的耳语

    $request->server 包含了服务器的一些信息,比如请求的方法、URI、查询字符串等。

    字段 含义 例子
    request_method 请求方法,比如 GETPOSTPUTDELETE 等。 GET, POST
    request_uri 请求的 URI,包含了路径和查询字符串。 /path/to/resource?param1=value1
    path_info 请求的路径信息,不包含查询字符串。 /path/to/resource
    query_string 查询字符串,也就是 ? 后面的部分。 param1=value1&param2=value2
    remote_addr 客户端的 IP 地址。 127.0.0.1
    remote_port 客户端的端口号。 12345

    你可以通过 $request->server['request_method'] 获取请求方法,通过 $request->server['request_uri'] 获取请求的 URI。

    注意: $request->server 中的键名都是大写的。

  3. $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 不会自动解析,你需要手动处理。

  4. $request->files:文件的秘密通道

    如果请求中包含了文件上传,$request->files 就会存储上传的文件信息。

    每个上传的文件都是一个数组,包含了以下信息:

    字段 含义
    name 原始文件名。
    type 文件类型(MIME 类型)。
    tmp_name 临时文件的路径。
    error 错误代码,0 表示上传成功。
    size 文件大小(字节)。

    你需要使用 move_uploaded_file() 函数将临时文件移动到你想要保存的位置。

    重要提示: 为了安全起见,一定要对上传的文件进行验证,比如检查文件类型、大小等。

  5. $request->cookie:甜蜜的饼干

    $request->cookie 存储了客户端发送的 Cookie 信息。你可以通过 $request->cookie['cookie_name'] 获取 Cookie 的值。

    Cookie 就像客户端存储在本地的一小段数据,服务器可以通过 Cookie 来识别用户,保持会话状态。

  6. $request->rawContent():原始数据的真相

    有时候,你需要获取请求的原始数据,比如 JSON 数据、XML 数据等。$request->rawContent() 可以返回请求的原始数据。

    友情提示: 获取原始数据后,你需要自己进行解析。

三、Swoole Http Response:服务器的低语

Swoole 的 SwooleHttpResponse 对象,就是服务器 Response 的化身。它负责将服务器的处理结果发送给客户端。

  1. $response->header():头部的声明

    你可以使用 $response->header() 方法来设置 HTTP 头部。

    $response->header('Content-Type', 'application/json');
    $response->header('Cache-Control', 'no-cache');

    注意: 必须在发送内容之前设置头部。

  2. $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。
  3. $response->status():状态的宣告

    你可以使用 $response->status() 方法来设置 HTTP 状态码。

    $response->status(200); // OK
    $response->status(404); // Not Found
    $response->status(500); // Internal Server Error

    HTTP 状态码是服务器告诉客户端请求处理结果的一种方式。

  4. $response->write():书写内容

    你可以使用 $response->write() 方法来写入响应内容。

    $response->write('Hello, world!');
    $response->write('<br>');
    $response->write('This is a Swoole HTTP server.');

    重要提示: 可以多次调用 $response->write() 方法,Swoole 会将所有内容拼接起来发送给客户端。

  5. $response->end():画上句号

    你必须调用 $response->end() 方法来结束响应,并将所有内容发送给客户端。

    $response->end();

    注意: 在调用 $response->end() 方法之后,就不能再写入任何内容了。

  6. $response->sendfile():传送文件的魔法

    你可以使用 $response->sendfile() 方法来发送文件。

    $response->sendfile('/path/to/file.jpg');

    优点: 效率高,避免了将文件内容读取到内存中再发送。

  7. $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();

代码解析:

  1. 创建一个 Swoole HTTP 服务器,监听 0.0.0.0:9501
  2. 监听 request 事件,当有新的请求到来时,执行回调函数。
  3. $request->get 中获取 name 参数,如果没有,则默认为 Guest
  4. 使用 $response->cookie() 设置一个名为 X-ID 的 Cookie。
  5. 使用 $response->header() 设置响应的 Content-Type。
  6. 使用 $response->write() 写入 HTML 内容,包括欢迎信息、User-Agent 和 IP 地址。
  7. 检查是否有文件上传,如果有,则将文件保存到 /tmp 目录下。
  8. 使用 $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 的 SwooleHttpRequestSwooleHttpResponse 对象。它们是 Web 应用的基石,掌握它们,你就能构建出更高效、更强大的 Web 应用。

记住,Request 和 Response 就像一对默契的舞伴,只有彼此配合,才能跳出最美的舞蹈。💃🕺

希望今天的分享对你有所帮助!下次再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注