C++-Mongoose(3)-http-server-https-restful

news2024/10/6 8:33:26

1.url 结构

2.http和 http-restful区别在于对于mg_tls_opts的赋值

 

  2.1 http和https 区分


       a) port地址

static const char *s_http_addr = "http://0.0.0.0:8000";    // HTTP port

static const char *s_https_addr = "https://0.0.0.0:8443";  // HTTPS port
   

     b)https时 对mg_tls_opts赋值
 

 struct mg_tls_opts opts = {
#ifdef TLS_TWOWAY
        .ca = mg_str(s_tls_ca),
#endif
        .cert = mg_str(s_tls_cert),
        .key = mg_str(s_tls_key)};
    mg_tls_init(c, &opts);
  }

  3个重要变量:
static const char* s_tls_ca ;
static const char* s_tls_cert;
static const char* s_tls_key;

#ifdef TLS_TWOWAY
static const char* s_tls_ca =
"-----BEGIN CERTIFICATE-----\n"
"MIIBqjCCAU+gAwIBAgIUESoOPGqMhf9uarzblVFwzrQweMcwCgYIKoZIzj0EAwIw\n"
"RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\n"
"YTESMBAGA1UEAwwJVGVzdCBSb290MCAXDTIwMDUwOTIxNTE0NFoYDzIwNTAwNTA5\n"
"MjE1MTQ0WjBEMQswCQYDVQQGEwJJRTEPMA0GA1UEBwwGRHVibGluMRAwDgYDVQQK\n"
"DAdDZXNhbnRhMRIwEAYDVQQDDAlUZXN0IFJvb3QwWTATBgcqhkjOPQIBBggqhkjO\n"
"PQMBBwNCAAQsq9ECZiSW1xI+CVBP8VDuUehVA166sR2YsnJ5J6gbMQ1dUCH/QvLa\n"
"dBdeU7JlQcH8hN5KEbmM9BnZxMor6ussox0wGzAMBgNVHRMEBTADAQH/MAsGA1Ud\n"
"DwQEAwIBrjAKBggqhkjOPQQDAgNJADBGAiEAnHFsAIwGQQyRL81B04dH6d86Iq0l\n"
"fL8OKzndegxOaB0CIQCPwSIwEGFdURDqCC0CY2dnMrUGY5ZXu3hHCojZGS7zvg==\n"
"-----END CERTIFICATE-----\n";
#endif
static const char* s_tls_cert =
"-----BEGIN CERTIFICATE-----\n"
"MIIBhzCCASygAwIBAgIUbnMoVd8TtWH1T09dANkK2LU6IUswCgYIKoZIzj0EAwIw\n"
"RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\n"
"YTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE0OVoXDTMwMDUwOTIx\n"
"NTE0OVowETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD\n"
"QgAEkuBGnInDN6l06zVVQ1VcrOvH5FDu9MC6FwJc2e201P8hEpq0Q/SJS2nkbSuW\n"
"H/wBTTBaeXN2uhlBzMUWK790KKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw\n"
"EwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAwRgIhAPo6xx7LjCdZ\n"
"QY133XvLjAgVFrlucOZHONFVQuDXZsjwAiEAzHBNligA08c5U3SySYcnkhurGg50\n"
"BllCI0eYQ9ggp/o=\n"
"-----END CERTIFICATE-----\n";

static const char* s_tls_key =
"-----BEGIN PRIVATE KEY-----\n"
"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglNni0t9Dg9icgG8w\n"
"kbfxWSS+TuNgbtNybIQXcm3NHpmhRANCAASS4EacicM3qXTrNVVDVVys68fkUO70\n"
"wLoXAlzZ7bTU/yESmrRD9IlLaeRtK5Yf/AFNMFp5c3a6GUHMxRYrv3Qo\n"
"-----END PRIVATE KEY-----\n";

   2.2code


   restfulserver_fn函数         

static void restfulserver_fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) 
{
  if (ev == MG_EV_ACCEPT && fn_data != NULL)  //1.如果收到消息 MG_EV_ACCEPT
  {
      struct mg_tls_opts opts =               //1.1.结构赋值
      {
          #ifdef TLS_TWOWAY
            .ca = mg_str(s_tls_ca),
          #endif
             .cert = mg_str(s_tls_cert),
             .key = mg_str(s_tls_key)
        };   
       mg_tls_init(c, &opts);                  //1.2放入上下文中
   }


  if (ev == MG_EV_HTTP_MSG)                    //2.如果收到消息 MG_EV_HTTP_MSG
  {
      struct mg_http_message *hm = (struct mg_http_message *) ev_data;
      //1.get请求 ,显示
      if (mg_http_match_uri(hm, "/api/stats"))   
      {
      // Print some statistics about currently established connections
          mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n");
          mg_http_printf_chunk(c, "ID PROTO TYPE      LOCAL           REMOTE\n");
          for (struct mg_connection *t = c->mgr->conns; t != NULL; t = t->next) 
          {
              mg_http_printf_chunk(c, "%-3lu %4s %s %M %M\n", t->id,
                                 t->is_udp ? "UDP" : "TCP",
                                 t->is_listening  ? "LISTENING"
                                 : t->is_accepted ? "ACCEPTED "
                                                  : "CONNECTED",
                             mg_print_ip, &t->loc, mg_print_ip, &t->rem);
         }
         mg_http_printf_chunk(c, "");  // Don't forget the last empty chunk
      } 
      //2.post请求 回result
      else if (mg_http_match_uri(hm, "/api/f2/*"))  
      {
         mg_http_reply(c, 200, "", "{\"result\": \"%.*s\"}\n", (int) hm->uri.len,
                    hm->uri.ptr);
      } 
      //3.显示当前目录文件列表

      else                           
      {
         struct mg_http_serve_opts opts = {.root_dir = s_root_dir};
         mg_http_serve_dir(c, ev_data, &opts);
      }
  }
  (void) fn_data;
}


   main 函数

void main()
{
	struct mg_mgr mgr;                            // Event manager
	mg_log_set(MG_LL_DEBUG);                      // Set log level
	mg_mgr_init(&mgr);                            // Initialise event manager
	mg_http_listen(&mgr, s_http_addr, restfulserver_fn, NULL);  // Create HTTP listener
	mg_http_listen(&mgr, s_https_addr, restfulserver_fn, (void*)1);  // HTTPS listener
	for (;;) mg_mgr_poll(&mgr, 1000);                    // Infinite event loop
	mg_mgr_free(&mgr);
}


 

2.3测试
 

 启动httpserver 程序
1.2.1  浏览器访问:http://127.0.0.1:8000:
         将显示exe程序根目录文件列表
1.2.2  浏览器访问: http://127.0.0.1:8000/api/stats:
         将显示:
        

         
1.2.3 使用postman: 发送post请求:
          http://127.0.0.1:8000/api/f2/*,
     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1077059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot全局异常和自定义异常

目录 依赖 一、全局异常处理 1、系统异常 2、业务异常 &#xff08;1&#xff09;、接口配置 &#xff08;2&#xff09;、服务配置 二、自定义异常 依赖 <!-- validator&#xff0c;用于接口参数校验 --><dependency><groupId>org.hibernate.valida…

淘宝京东拼多多品牌价格监控API接口

淘宝、京东、拼多多品牌价格监控API接口需要从官方平台获取&#xff0c;以下是具体步骤&#xff1a; 登录京东、天猫、淘宝、拼多多、苏宁、国美、唯品会等电商平台&#xff0c;注册并获取开发者账号和API接口权限。通过开发者账号和API接口权限&#xff0c;访问京东、天猫、淘…

linux中单节点安装greenplum数据库

目录 一、安装包准备 二、关闭防火墙 三、安装greenplum依赖包 四、添加配置 五、新建greenplum用户 六、安装greenplum安装包 七、设置环境变量 八、权限互通 九、修改数据库配置文件 十、初始化数据库 十一、配置远程连接文件 十二、说明 一、安装包准备 下载准备…

Windows网络管理及诊断命令整理

目录 traceroute&#xff1a; ping&#xff1a; pathping: netstat: ipconfig&#xff1a; nslookup&#xff1a; route&#xff1a; ARP: FTP: netsh&#xff1a; nbtstat&#xff1a; sniffer(嗅探器)&#xff1a; winipcfg&#xff1a; traceroute&#xff1a; …

【无公网IP内网穿透】基于NATAPP搭建Web站点

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《.内网穿透》。&#x1f3af;&#x1f3af; &#…

读书笔记:多Transformer的双向编码器表示法(Bert)-4

多Transformer的双向编码器表示法 Bidirectional Encoder Representations from Transformers&#xff0c;即Bert&#xff1b; 第二部分 探索BERT变体 从本章开始的诸多内容&#xff0c;以理解为目标&#xff0c;着重关注对音频相关的支持&#xff08;如果有的话&#xff09;…

Nginx、Git、Gitee的介绍及使用

目录 1、项目启动思路 2、Nginx 一、下载Nginx 1、下载地址 2、选择下载稳定版本 3、解压安装包 二、Nginx的原理 1、原理图 2、流程分析 三、配置Nginx 1、第一步&#xff1a;解决各种js报错 2、第二步&#xff1a;配置Nginx 3、启动/停止/重启Nginx 4、访问网址 …

企业信息查询:洞悉市场,抢占先机

随着互联网的普及和信息技术的不断发展&#xff0c;我们对于企业工商信息的需求逐渐增加&#xff0c;市面上也出现了很多查询企业信息的产品。作为一家专业的企业数据提供商&#xff0c;经过精心地研发&#xff0c;我们打造了一款“公抓抓”&#xff0c;该平台可以批量爬取国家…

计网 静态库和动态库

计网 静态库和动态库 一.我们先来了解一下一个程序编译成可执行文件的四个过程 1.预处理期&#xff08;预编译&#xff09; 在预处理期会进行替换&#xff0c;将头文件和宏定义进行替换 2.编译期 编译期会将源代码变为汇编语言 3.汇编期 汇编期是把汇编语言变为机器语言…

STM32F103标准库硬件IIC+DMA连续数据发送、接收

目录 前言1、AHT20模块的简单了解&#xff08;为了更好的理解程序语句&#xff09;2、了解DMA相关中断标志位以及I2C相对应的DMA通道3、本篇文章提及程序中相关的变量定义提前了解4、DMAIIC数据发送、接收流程及本文所用程序中相关的函数作用提前了解4.1 DMAIIC数据发送、接收流…

qt判断当前日期是不是当月的最后一天

思路就是&#xff1a;将当前日期1&#xff0c;如果月份发生变化&#xff0c;则证明是最后一天 找一个dateTimeEdit&#xff0c;然后选择个日期&#xff0c;如下&#xff1a; 加入测试代码&#xff1a; QDateTime time ui->dateTimeEdit->dateTime();QDateTime nextWeek…

Debezium日常分享系列之:Debezium 2.3.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 2.3.0.Final发布 一、重大改变二、PostgreSQL / MySQL 安全连接更改三、JDBC 存储编码更改四、新功能和改进五、Kubernetes 的 Debezium Server Operator六、新的通知子系统七、新的可扩展信号子系统八、JMX 信号和通知集成九、新的…

如何查看dll文件内导出函数名称

一 使用VS自带工具 进入VS开发环境&#xff0c;然后Tools -> Visual studio 2017 Command Prompt&#xff0c;打开兼容工具命令提示符&#xff0c; 如果工具 目录下没有命令行提示&#xff0c;可以从开始菜单找到VS的命令行提示符。 cd到dll所在目录&#xff0c;输入命令…

联邦学习综述

《Advances and Open Problems in Federated Learning》 选题&#xff1a;Published 10 December 2019-Computer Science-Found. Trends Mach. Learn. 联邦学习定义 联邦学习是一种机器学习设置&#xff0c;其中多个客户端在中央服务器或服务提供商的协调下协作解决机器学习…

VR会议:远程带看功能,专为沉浸式云洽谈而生

随着科技的不断发展&#xff0c;VR技术已经成为当今市场上较为热门的新型技术之一了&#xff0c;而VR会议远程带看功能&#xff0c;更是为用户提供更加真实、自然的沉浸式体验。 随着5G技术的发展&#xff0c;传统的图文、视频这种展示形式已经无法满足消费者对信息真实性的需求…

存档&改造【04】二维码操作入口设置细节自动刷新设置后的交互式网格内容的隐藏

因为数据库中没有数据无法查看设置效果&#xff0c;于是自己创建了个测试数据表&#xff0c;用来给demo测试 -- 二维码操作入口设置 create table JM_QR_CODE(QR_CODE_ID NUMBER generated as identity primary key,SYSTEM_ID NUMBER(20) not null,IS_ENAB…

中国数字化转型浪潮下,移动钱包成为全球App标配

中国&#xff0c;一个数字化转型极为快速的国家&#xff0c;在电子钱包和移动支付方面处于世界领先地位。 在中国&#xff0c;几乎一半的店内购物都是通过手机进行的&#xff0c;这远高于其他发达市场的水平&#xff08;德国25%&#xff0c;美国24%&#xff09;。移动支付&…

AI情感陪伴 | 数字伙伴为你而在,解锁情感健康的新时代

当我们审视当今社会的变革和进步时&#xff0c;不难发现新一代年轻人正面临着前所未有的多重挑战。其中就涵盖了社交关系的复杂性、学业上的巨大压力、激烈的就业竞争&#xff0c;以及紧迫的环境问题等等。这些挑战不仅深刻地影响着他们的生活品质&#xff0c;还可能引发严重的…

AUTOSAR CAN通信全过程

1、CAN通信概略图和基本概念介绍 应用层APPL、RTE&#xff08;实时运行环境 Runtime Environment&#xff09; 交互层&#xff1a; IPDU multiplexer&#xff1a;协议数据单元复用模块 COM&#xff1a;COMMUNICATION 通信模块 DCM: 诊断通信管理模块&#xff08;Diagnostic C…

多项目并行管理:优化协调策略提高效率

多项目同时进行已然是大部分项目管理者面临的现状了。相比于单项目管理&#xff0c;多项目管理可能会出现项目资源分配不均&#xff0c;项目进度监控难以及沟通协作复杂等问题。 可以通过一款灵活高效得项目管理工具&#xff0c;来帮助您进行多项目管理&#xff0c;比如 Zoho …