cpp-httplib实现HTTP Server接收带参数的URL

news/2024/10/25 14:41:36/

URL中符号意义

  • / 分隔目录和子目录

  • ?分隔实际的URL和参数

  • & URL中指定的参数间的分隔符

  • = URL中指定的参数的值

  • + 表示空格(在URL中不能使用空格)

  • # 表示书签

在RESTful风格的API中常见的URL样式:

  • 带时间路径的URL
    http://127.0.0.1:8080/Date/20230323173037
  • 使用 ? 符号的分隔符
    http://127.0.0.1:8080/Hld?date=20230323173037
  • 使用 & 符号带2个参数
    http://127.0.0.1:8080/Hld?date=20230323173037&date=20230366

代码演示获取参数:

#include <iostream>
#include <string>
#include <map>
#include <httplib.h>using namespace std;
using namespace httplib;int main()
{multimap<string, string> m = { {"HTTP0.9", "1991"}, {"HTTP1.0", "1996"}, {"HTTP1.1", "1999"} };for (multimap<string, string>::iterator it = m.begin(); it != m.end(); ++it){cout << "[" << (*it).first << ", " << (*it).second << "]" << endl;}Server svr;svr.set_keep_alive_max_count(10);svr.set_keep_alive_timeout(10);svr.set_payload_max_length(1024 * 1024 * 512);svr.Get("/Hld", [&](const Request& req, Response& res) {cout << req.matches[0] << endl;cout << "params.size() = " << req.params.size() << endl;string context;for(std::multimap<std::string, std::string>::const_iterator it = req.params.begin(); it != req.params.end(); ++it){string params = it->first + " = " + it->second;cout << params << endl;context += params += "\n";}res.set_content(context, "text/plain");});svr.set_error_handler([&](const Request& req, Response& res) {auto fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>";char buf[BUFSIZ];snprintf(buf, sizeof(buf), fmt, res.status);res.set_content(buf, "text/html");});// Loggingsvr.set_logger([&](const Request& req, const Response& res) {for(std::multimap<std::string, std::string>::const_iterator it = req.params.begin(); it != req.params.end(); ++it){string params = it->first + "=" + it->second;cout <<"[" << __FILE__ << ":" << __LINE__ << "] " << it->first << "=" << it->second << endl;}});svr.listen("0.0.0.0", 8080);return 0;
}

在这里插入图片描述

由于 ? 符号是分隔实际的URL和参数,所以 req.matches[0] 并不能获取到URL的参数,只能获得带路径的 / 符号后面的数据,而 req.params 才是获取URL的参数,理解URL才是理解代码的关键。


http://www.ppmy.cn/news/34905.html

相关文章

Flutter GetX 实现 ChatGPT 简单聊天界面

Flutter 是一款跨平台的移动应用开发框架&#xff0c;而 GetX 是 Flutter 中一种简单易用的状态管理和路由管理工具。本篇我们将使用 Flutter 和 GetX 实现一个简单的聊天界面&#xff0c;以与 ChatGPT 进行交互。 我们需要在 Flutter 项目中引入 GetX 库。在pubspec.yaml文件…

组件自定义事件

绑定 组件自定义事件跟子传递很像 相同的是无论你使用的是props或者自定义事件&#xff0c;都是要使用到回调函数 子传父 需要亲自是收一下&#xff0c;然后调用一下 而自定义事件是没有给子组件传东西&#xff0c;只是这个当做事件的回调而已 对比一下student并没有数据来接收…

做Vinted要注意什么?详细避坑指南参考

最近有很多人向东哥我咨询vinted这个平台&#xff0c;很多朋友都是想咨询vinted这个平台好做吗&#xff1f;主要卖什么商品好卖一点&#xff0c;有没有什么注意事项。今天东哥就一一给大家解答。 Vinted平台好做吗&#xff1f; Vinted面向的市场主要是欧美市场&#xff0c;那平…

被隐藏的过程——预处理

文章目录0. 前言1. 程序的翻译环境和执行环境2. 被隐藏的过程2.1 翻译环境2.2 编译3.2.1 预编译3.2.2 编译2.2.3 汇编2.3 链接2.4 运行环境3. 预处理3.1 预定义符号3.2 #define3.2.1 #define定义标识符3.2.2 #define定义宏3.2.3 #define替换规则3.2.4 #和##3.2.5 带副作用的宏参…

信息系统项目管理师第四版知识摘编:第6章 项目管理概论

第6章 项目管理概论6.1PMBOK的发展PMBOK项目管理知识体系(Project Management Body Of Knowledge, PMBOK)是由美国项目管理协会(Project Management Institute,PMI)开发的一套描述项目管理专业范围的知识体系&#xff0c;包含了对项目管理所需的知识、技能和工具的描述。编辑切…

Android开发工程师想找工作需要掌握哪些

前言 目前互联网行业越来越好&#xff0c;进入这个行业的人员也是越来越多。从开发的角度来看&#xff0c;开发的职位主要分前端&#xff0c;后端&#xff0c;客户端&#xff08;主要分为ios和android开发&#xff09;以及算法工程师等。 Android开发一直是当前互联网行业中最…

清晰概括:进程与线程间的区别的联系

相关阅读&#xff1a; &#x1f517;通俗简介&#xff1a;操作系统之进程的管理与调度&#x1f517;如何使用 jconsole 查看Java进程中线程的详细信息&#xff1f; 目录 一、进程与线程 1、进程 2、线程 二、进程与线程之间的区别和联系 1、区别 2、联系 一、进程与线程 …

【数据结构与算法】队列和栈的相互实现以及循环队列

目录&#x1f314;一.用队列实现栈&#x1f319;1.题目描述&#x1f319;2.思路分析&#x1f319;3.代码实现⛈二.用栈实现队列☔1.题目描述☔2.思路分析☔3.代码实现&#x1f308;三.实现循环队列&#x1f314;一.用队列实现栈 &#x1f319;1.题目描述 我们先看一下题目链接…