当前位置: 首页 > news >正文

6.将cr打包成网络服务|使用postman进行测试|编写oj_server的服务路由功能(C++)

将cr打包成网络服务

compile_server.cc

#include "compile_run.hpp"
#include "../comm/httplib.h"using namespace ns_compile_and_run;
using namespace httplib;//编译服务随时可能被多个人请求,必须保证传递上来的code,形成源文件名称的时候,要具有
//唯一性,要不然多个用户之间会互相影响
int main()
{Server svr;svr.Get("/hello",[](const Request &req, Response &resp){// 用来进行基本测试resp.set_content("hello httplib,你好 httplib!", "text/plain;charset=utf-8");});svr.Post("/compile_and_run", [](const Request &req, Response &resp){// 用户请求的服务正文是我们想要的json stringstd::string in_json = req.body;std::string out_json;if(!in_json.empty()){CompileAndRun::Start(in_json, &out_json);resp.set_content(out_json, "application/json;charset=utf-8");}});//svr.set_base_dir("./wwwroot");  svr.listen("0.0.0.0", 8080); //启动http服务//提供的编译服务,打包形成一个网络服务//cpp-httplib// in_json: {"code": "#include...", "input": "","cpu_limit":1, "mem_limit":10240}// out_json: {"status":"0", "reason":"","stdout":"","stderr":"",}// 通过http 让client 给我们 上传一个json string// 下面的工作,充当客户端请求的json串std::string in_json;Json::Value in_value;//R"()", raw stringin_value["code"] = R"(#include<iostream>int main(){std::cout << "你可以看见我了" << std::endl;return 0;})";in_value["input"] = "";in_value["cpu_limit"] = 1;in_value["mem_limit"] = 10240*3;Json::FastWriter writer;in_json = writer.write(in_value);std::cout << in_json << std::endl;//这个是将来给客户端返回的json串std::string out_json;CompileAndRun::Start(in_json, &out_json);std::cout << out_json << std::endl;return 0;
}

使用postman进行测试

安装postman
Download Postman | Get Started for Free
![[Pasted image 20250224130013.png]]

填入对应内容
地址是http://47.94.228.92:8080/compile_and_run
选择POST,raw和JSON

{"code" : "#include <iostream>\nint main(){std::cout << \"你好,编译服务!\" << std::endl;}","input" : "","cpu_limit" : 1,"mem_limit" : 50000
}

![[Pasted image 20250224130905.png]]

编译运行成功
![[Pasted image 20250224131023.png]]

{"code" : "#include <iostream>\nint main(){while(1);std::cout << \"你好,编译服务!\" << std::endl;}","input" : "","cpu_limit" : 1,"mem_limit" : 50000
}

![[Pasted image 20250224131124.png]]

#include "compile_run.hpp"
#include "../comm/httplib.h"using namespace ns_compile_and_run;
using namespace httplib;void Usage(std::string proc)
{std::cerr << "Usage: " << "\n\t" << proc << " port" << std::endl;
}//编译服务随时可能被多个人请求,必须保证传递上来的code,形成源文件名称的时候,要具有
//唯一性,要不然多个用户之间会互相影响
//./compile_server port
int main(int argc, char *argv[])
{if(argc != 2){Usage(argv[0]);return 1;}Server svr;svr.Get("/hello",[](const Request &req, Response &resp){// 用来进行基本测试resp.set_content("hello httplib,你好 httplib!", "text/plain;charset=utf-8");});svr.Post("/compile_and_run", [](const Request &req, Response &resp){// 用户请求的服务正文是我们想要的json stringstd::string in_json = req.body;std::string out_json;if(!in_json.empty()){CompileAndRun::Start(in_json, &out_json);resp.set_content(out_json, "application/json;charset=utf-8");}});//svr.set_base_dir("./wwwroot");  svr.listen("0.0.0.0", atoi(argv[1])); //启动http服务//提供的编译服务,打包形成一个网络服务//cpp-httplib// in_json: {"code": "#include...", "input": "","cpu_limit":1, "mem_limit":10240}// out_json: {"status":"0", "reason":"","stdout":"","stderr":"",}// 通过http 让client 给我们 上传一个json string// 下面的工作,充当客户端请求的json串std::string in_json;Json::Value in_value;//R"()", raw stringin_value["code"] = R"(#include<iostream>int main(){std::cout << "你可以看见我了" << std::endl;return 0;})";in_value["input"] = "";in_value["cpu_limit"] = 1;in_value["mem_limit"] = 10240*3;Json::FastWriter writer;in_json = writer.write(in_value);std::cout << in_json << std::endl;//这个是将来给客户端返回的json串std::string out_json;CompileAndRun::Start(in_json, &out_json);std::cout << out_json << std::endl;return 0;
}

请求时候直接输入端口号
./compile_server 8080
这样输入不同的端口号进行申请,就会有多个编译服务
![[Pasted image 20250224133110.png]]

oj_server准备工作

基于MVC结构的oj服务设计

本质:建立一个小型网站

  1. 获取首页,用题目列表充当
  2. 编辑区域页面
  3. 提交判题功能(编译并运行)
    M:Model,通常是和数据交互的模块,比如,对题库进行增删改查(文件版,MySQL)
    V:view, 通常是拿到数据之后,要进行构建网页,渲染网页内容,展示给用户的(浏览器)
    C:control, 控制器,就是我们的核心业务逻辑
    ![[Pasted image 20250224134833.png]]

makefile

oj_server:oj_server.ccg++ -o $@ $^ -std=c++11.PHONY:clean
clean:rm -f oj_server

编写服务路由功能

oj_server.cc

using namespace httplib;int main()
{//用户请求的服务路由功能Server svr;// 获取所有的题目列表// 用户要根据题目编号,获取题目的内容// 用户提交代码,使用我们的判题功能(1. 每道题的测试用例 2. compile_and_run)svr.listen("0.0.0.0", 8080);return 0;
}

oj_server.cc

#include <iostream>
#include "../comm/httplib.h"using namespace httplib;int main()
{//用户请求的服务路由功能Server svr;// 获取所有的题目列表svr.Get("/all_questions", [](const Request &req, Response &resp){resp.set_content("这是所有题目的列表", "text/plain; charset=utf-8");});// 用户要根据题目编号,获取题目的内容// /question/100 -> 正则匹配// R"()", 原始字符串raw string,保持字符串内容的原貌,不用做相关的转义svr.Get(R"(/question/(\d+))", [](const Request &req, Response &resp){std::string number = req.matches[1];resp.set_content("这是指定的一道题:" + number, "text/plain; charset=utf-8");});// 用户提交代码,使用我们的判题功能(1. 每道题的测试用例 2. compile_and_run)svr.Post(R"(/judge/(\d+))", [](const Request &req, Response &resp){std::string number = req.matches[1];resp.set_content("指定题目的判题: " + number, "text/plain; charset=utf-8");});svr.listen("0.0.0.0", 8080);return 0;
}

makefile

oj_server:oj_server.ccg++ -o $@ $^ -std=c++11 -lpthread.PHONY:clean
clean:rm -f oj_server

编译运行
![[Pasted image 20250224140951.png]]

![[Pasted image 20250224140937.png]]

![[Pasted image 20250224141035.png]]

加入主页信息
![[Pasted image 20250224141744.png]]

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>这是我的个人OJ系统</title>
</head><h1>欢迎来到我的OJ</h1><p>这是我个人独立开发的在线OJ平台</p>
<body>
</body>
</html>

在oj_server.cc中加入svr.set_base_dir("./wwwroot");

#include <iostream>
#include "../comm/httplib.h"using namespace httplib;int main()
{//用户请求的服务路由功能Server svr;// 获取所有的题目列表svr.Get("/all_questions", [](const Request &req, Response &resp){resp.set_content("这是所有题目的列表", "text/plain; charset=utf-8");});// 用户要根据题目编号,获取题目的内容// /question/100 -> 正则匹配// R"()", 原始字符串raw string,保持字符串内容的原貌,不用做相关的转义svr.Get(R"(/question/(\d+))", [](const Request &req, Response &resp){std::string number = req.matches[1];resp.set_content("这是指定的一道题:" + number, "text/plain; charset=utf-8");});// 用户提交代码,使用我们的判题功能(1. 每道题的测试用例 2. compile_and_run)svr.Post(R"(/judge/(\d+))", [](const Request &req, Response &resp){std::string number = req.matches[1];resp.set_content("指定题目的判题: " + number, "text/plain; charset=utf-8");});svr.set_base_dir("./wwwroot");svr.listen("0.0.0.0", 8080);return 0;
}

![[Pasted image 20250224141707.png]]

相关文章:

6.将cr打包成网络服务|使用postman进行测试|编写oj_server的服务路由功能(C++)

将cr打包成网络服务 compile_server.cc #include "compile_run.hpp" #include "../comm/httplib.h"using namespace ns_compile_and_run; using namespace httplib;//编译服务随时可能被多个人请求&#xff0c;必须保证传递上来的code&#xff0c;形成源…...

基于SpringBoot + Vue的共享汽车(单车)管理系统设计与实现+毕业论文+开题报告+指导搭建视频

本系统包含管理员、用户两个角色。 管理员角色&#xff1a;个人中心管理、用户管理、投放地区管理、汽车信息管理、汽车投放管理、汽车入库管理、使用订单管理、汽车归还管理。 用户角色&#xff1a;注册登录、汽车使用下单、汽车归还。 本共享汽车管理系统有管理员和用户。管…...

Day54(补)【AI思考】-SOA,Web服务以及无状态分步解析与示例说明

文章目录 **SOA&#xff0c;Web服务以及无状态**分步解析与示例说明**分步解析与示例说明****1. 核心概念解析****2. 为什么说SOA与Web服务是“正交的”&#xff1f;****3. 架构风格 vs. 实现技术****4. 接口&#xff08;Interface&#xff09;的核心作用****5. Web服务的“被认…...

回溯算法之组合和排列问题

文章目录 1.什么是回溯算法2.回溯算法解题步骤3.回溯算法解决组合问题4.回溯算法解决排列问题 1.什么是回溯算法 回溯算法是一种通过尝试所有可能的解决方案来解决问题的算法策略&#xff0c;它通常用于求解组合优化、排列组合、路径搜索等类型的问题,是一种暴力求解的算法。 2…...

gihub上适合练手的Python项目

GitHub 上有许多适合练手的 Python 项目&#xff0c;涵盖了从初学者到中级开发者的不同难度级别。以下是一些推荐的项目类型和具体示例&#xff0c;帮助你提升 Python 编程技能&#xff1a; 1. 基础项目 适合初学者&#xff0c;帮助掌握 Python 基础语法和常用库。 示例项目&…...

解锁CSnakes:.NET与Python的融合魔法

一、引言 在软件开发的广袤领域中&#xff0c;我们常常面临各种复杂的业务需求和技术挑战。不同的编程语言犹如各具特色的工具&#xff0c;它们在不同的场景下展现出独特的优势。例如&#xff0c;C# 以其强大的类型系统和丰富的类库&#xff0c;在企业级应用开发中占据重要地位…...

Python常见面试题的详解16

1. 如何强行关闭客户端和服务器之间的连接&#xff1f; 在网络编程中&#xff0c;有时需要强行中断客户端和服务器之间的连接。对于基于 TCP 协议的连接&#xff0c;由于其面向连接的特性&#xff0c;需要采取特定的步骤来确保连接被正确关闭&#xff1b;而 UDP 是无连接协议&a…...

建筑兔零基础自学python记录29|实战词云可视化项目——分人物阵营词云(上)7

我们在上次情感分析的基础上&#xff0c;不分积极消极&#xff0c;按文本中人物的阵营分为3队。可以猜想按照积极消极分类是有现成的feeling可以分析&#xff0c;但人物阵营却是没有现成资料&#xff0c;需要额外给出信息的。 图1 图2 上面两图的文字大小和数量有区别&#xf…...

Vi 编辑器基本使用指南

一、Vi 编辑器的启动与退出 启动 Vi 编辑器 在终端中&#xff0c;输入vi加上要编辑的文件名&#xff0c;如vi example.txt&#xff0c;如果example.txt存在&#xff0c;Vi 编辑器会打开该文件&#xff1b;若不存在&#xff0c;则会创建一个新的空文件并打开。如果只输入vi&am…...

22、《Spring Boot消息队列:RabbitMQ延迟队列与死信队列深度解析》

Spring Boot消息队列实战&#xff1a;RabbitMQ延迟队列与死信队列深度解析 引言 在现代分布式系统中&#xff0c;消息队列承担着解耦、削峰填谷和异步通信的重要职责。本文将深入探讨Spring Boot与RabbitMQ的整合应用&#xff0c;重点解析延迟队列与死信队列的实现原理及实战…...

linux 命令+相关配置记录(持续更新...)

linux 命令记录相关配置记录 磁盘切换 cd D&#xff1a;#这里表示切换到D盘查看wsl 安装的linux 子系统 wsl --list -vwsl 卸载 linux 子系统 wsl --unregister -xxx # xxx 表示子系统的名字备份Linux 子系统 导出 wsl --export xxx yyy # xxx 表示子系统的名字 yyy 表示压…...

ssh工具

文章目录 ssh简介ssh远程连接Linux下使用SSH安装安装ssh服务端安装ssh客户端 命令启动重启查看ssh的状态 ssh 配置文件ssh连接地址 配置文件基本配置注意通配符心跳和密钥ssh的Include跳板 ProxyJump内网穿透 Windows下使用SSH安装ssh 配置文件ssh连接地址 配置文件 ssh简介 s…...

LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师

背景 前面的文章通过 Ollama 私有化部署了 Qwen2.5 (7B) 模型&#xff0c;然后使用 Docker Compose 一键部署了 Dify 社区版平台。 LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库&#xff1a;在 Dify 平台上&#xff0c;通过普通编排的方式&#xff0c;创建了基于…...

Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(二)

在 GPU0 和 GPU1 之间共享数据 在某些情况下&#xff0c;也许可以在某些时候带来更好的用户体验&#xff1a; GPU0 和 GPU1 来自同一个 IHV。GPU0 可以将操作系统无法解读的显示配置相关信息传递给 GPU1。 数据 Blob 由 GUID 描述&#xff0c;如果 GPU1 的驱动程序能理解数据…...

基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…...

软考教材重点内容 信息安全工程师 第17章 网络安全应急响应技术原理与应用

17.1 网络安全应急响应概述 网络安全应急响应是针对潜在发生的网络安全事件而采取的网络安全措施。 17.1.1 网络安全应急响应概念 网络安全应急响应是指为应对网络安全事件&#xff0c;相关人员或组织机构对网络安全事件进行监测、预警、分析、响应和恢复等工作。 17.2.3 网络安…...

使用 DeepSeek + OmniParser v2 + UIAutomation 实现 GUI 应用自动化测试的探索

一、背景 UI 自动化测试一直是软件开发中的难点之一。尽管有许多工具和技术(如 Selenium、Appium 等)可以帮助我们实现自动化测试,但这些工具在面对复杂的 UI 变化时,往往需要大量的维护工作。随着人工智能技术的进步,尤其是自然语言处理(NLP)和计算机视觉(CV)技术的…...

Spring Security面试题

Spring Security面试题 基础概念 Q1: Spring Security的核心功能有哪些&#xff1f; public class SecurityBasicDemo {// 1. 基本配置public class SecurityConfigExample {public void configDemo() {ConfigurationEnableWebSecuritypublic class SecurityConfig extends …...

从零开始构建基于DeepSeek的智能客服系统

在当今的数字化时代,智能客服系统已经成为企业与客户沟通的重要桥梁。它不仅能够提升客户体验,还能大幅降低企业的运营成本。本文将带领你从零开始,使用PHP和DeepSeek技术构建一个功能强大的智能客服系统。我们将通过具体的案例和代码示例,深入探讨如何实现这一目标。 1. …...

Linux故障排查和性能优化面试题及参考答案

目录 如何查看 Linux 系统中的 CPU、内存、磁盘等资源使用情况? 什么是 Linux 中的负载(Load Average)?如何解读它? 如何通过 top 和 htop 命令监控系统性能? 如何使用 mpstat 命令来查看 CPU 的利用情况? 如何分析系统 CPU 瓶颈? 如何分析 CPU 瓶颈?如何优化 CP…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...