一个 HTTP 请求通常包含以下几个主要部分:
-
请求行:通常包括请求方法(如 GET、POST 等)、URI(资源标识符)和 HTTP 版本。
GET /path/to/resource?query=param HTTP/1.1
-
请求头:包含关于请求的附加信息,如主机、用户代理、内容类型、授权信息等。
Host: localhost:8080 User-Agent: curl/7.64.1 Accept: */*
-
请求体:对于某些请求方法(如 POST、PUT),请求中可能包含一个主体,通常是要发送到服务器的数据。
{"key": "value"}
URI 的组件
URI 可以分为几个部分,标准的 URI 结构通常如下:
scheme://host:port/path?query#fragment
- scheme: 协议,例如
http
、https
等. - host: 主机名或 IP 地址,例如
localhost
或192.168.1.1
. - port: 可选的端口号,通常是
80
(HTTP)或443
(HTTPS)。 - path: 请求的资源路径,例如
/user_login
。 - query: 可选的查询字符串,包含键值对,例如
?search=keyword&sort=asc
。 - fragment: 可选的片段标识符,通常用于指向文档中的位置,例如
#section1
。
具体示例
假设 _request.target()
返回的 URI 是 /user_login?user=name&pass=12345
,那么:
- Path:
/user_login
- Query String:
user=name&pass=12345
在这种情况下,如果想从 request.target()
分割出路径和查询参数,可以使用字符串操作函数。例如,以下是 C++ 示例代码,说明如何分割路径和查询部分:
#include <iostream>
#include <string>
void ParseTarget(const std::string &target) {
size_t query_start = target.find('?');
std::string path;
std::string query;
if (query_start != std::string::npos) {
path = target.substr(0, query_start);
query = target.substr(query_start + 1); // 获取问号后面的部分
} else {
path = target; // 如果没有查询字符串,整个 target 即为路径
}
// 输出结果
std::cout << "Path: " << path << std::endl;
std::cout << "Query: " << query << std::endl;
}
int main() {
std::string uri = "/user_login?user=name&pass=12345";
ParseTarget(uri);
return 0;
}
输出结果
当运行上述示例代码时,您将得到:
Path: /user_login
Query: user=name&pass=12345