C++无Boost库提取HTTP请求中Authorization后的令牌字符串
我明白你遇到的麻烦了——从长HTTP字符串里精准抠出那个Basic令牌确实容易卡壳,尤其是不能用Boost的情况下。别担心,用标准C++库就能搞定,而且逻辑很清晰,完全符合你的要求(提取结果不含任何空格)。
核心思路
- 定位前缀:先找到固定的
Authorization: Basic(注意末尾有个空格)在字符串中的位置,这是令牌的起始标记。 - 确定令牌范围:从前缀结束的位置开始,一直取到第一个空白字符(空格、换行、制表符等)为止——因为Base64格式的令牌本身不会包含这些空白字符,而HTTP头的字段值会在换行或空格处结束。
- 提取子串:根据找到的起始和结束位置,截取出目标令牌。
代码实现
#include <string> #include <iostream> std::string extractBasicAuthToken(const std::string& http_request) { // 定义固定前缀,注意末尾的空格 const std::string auth_prefix = "Authorization: Basic "; size_t prefix_pos = http_request.find(auth_prefix); // 容错处理:如果没找到前缀(虽然你说一定存在) if (prefix_pos == std::string::npos) { return ""; } // 计算令牌的起始位置:前缀结束后的第一个字符 size_t token_start = prefix_pos + auth_prefix.size(); // 找到令牌的结束位置:从起始位置开始找第一个空白字符 size_t token_end = http_request.find_first_of(" \r\n\t", token_start); // 如果到字符串末尾都没找到空白,就取到最后 if (token_end == std::string::npos) { token_end = http_request.size(); } // 提取令牌,确保没有空格 return http_request.substr(token_start, token_end - token_start); } int main() { // 你的HTTP请求字符串 std::string http_request = R"(GET /analysis HTTP/1.1 Host: localhost:4433 User-Agent: curl/7.47.0 Accept: */* Authorization: Basic MTIzYWxpY2U6bWVyY3VyeQ== Content-Length: 40 Content-Type: application/x-www-form-urlencoded {"u_id": 62, "g_id": 14, "a_type": "LR"})"; std::string token = extractBasicAuthToken(http_request); std::cout << "提取到的令牌:" << token << std::endl; // 输出结果:MTIzYWxpY2U6bWVyY3VyeQ== return 0; }
关键细节说明
- 用
find_first_of找空白字符,能覆盖HTTP头中可能出现的各种换行(\r、\n、\r\n)和空格情况,确保不会把后续的头字段或内容包含进来。 - 加入了容错处理,比如前缀不存在时返回空字符串,避免程序崩溃——虽然你说前缀一定存在,但这样代码更健壮。
- 提取的子串天然不含空格,因为我们是从前缀后的非空格位置开始,到第一个空白字符结束,完美符合你的要求。
内容的提问来源于stack exchange,提问作者Kumar Roshan Mehta
相关产品推荐
相关产品推荐

