热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用cpphttplib构建HTTP服务器以处理带有查询参数的URL请求

URL中符号意义 / 分隔目录和子目录 ?分隔实际的URL和参数 & URL中指定的参数间的分隔符 = URL中指定的参数的值 + 表示空格(在U
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
#include
#include
#include using namespace std;
using namespace httplib;int main()
{multimap<string, string> m &#61; { {"HTTP0.9", "1991"}, {"HTTP1.0", "1996"}, {"HTTP1.1", "1999"} };for (multimap<string, string>::iterator it &#61; m.begin(); it !&#61; m.end(); &#43;&#43;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() &#61; " << req.params.size() << endl;string context;for(std::multimap<std::string, std::string>::const_iterator it &#61; req.params.begin(); it !&#61; req.params.end(); &#43;&#43;it){string params &#61; it->first &#43; " &#61; " &#43; it->second;cout << params << endl;context &#43;&#61; params &#43;&#61; "\n";}res.set_content(context, "text/plain");});svr.set_error_handler([&](const Request& req, Response& res) {auto fmt &#61; "

Error Status: %d

";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 &#61; req.params.begin(); it !&#61; req.params.end(); &#43;&#43;it){string params &#61; it->first &#43; "&#61;" &#43; it->second;cout <<"[" << __FILE__ << ":" << __LINE__ << "] " << it->first << "&#61;" << it->second << endl;}});svr.listen("0.0.0.0", 8080);return 0;
}

在这里插入图片描述

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


推荐阅读
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 线段树详解与实现
    本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。 ... [详细]
  • Irish budget airline Ryanair announced plans to significantly increase its route network from Frankfurt Airport, marking a direct challenge to Lufthansa, Germany's leading carrier. ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
  • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
author-avatar
老娘叫凌凌_523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有