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 string
        std::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 string
    in_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 string
        std::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 string
    in_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.cc
    g++ -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.cc
    g++ -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]]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js前端数据加密 CryptoJS库加密 黑盒情况下寻找web的加密算法 代码混淆

前言 前端的数据加密是对用户的输入的一个常见的加密方法 还有的就是防止我们的sql注入 如 idMQ 这个其实解密出来就是 id 1 所以注入的思路就是 把 1和payload 一起加密然后 再进行注入 客户端的加密 > 数据加密传输 > 服务端解密 > 服务端的处理 传输的…

window平台上qtcreator上使用opencv报错

平台&#xff1a;win11 随便在网上下载一个别人编译好的opencv,发现运行报错 发现此次下载的opencv&#xff0c;别人在编译时选用的mingw版本应该和我电脑目前安装的mingw的版本不太一致 右键桌面的qtcreator图标&#xff0c;进入Tools目录&#xff0c;可以看到mingw的版本是…

Android之APP更新(通过接口更新)

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说&#xff0c;APP更新功能再常见不过了&#xff0c;因为平台更新审核时间较长&am…

数字信任的底层逻辑:密码学核心技术与现实应用

安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用&#xff0c;涵盖 1&…

达梦有没有类似oerr的功能

在oracle 23ai的sqlplus中&#xff0c;直接看异常信息说明&#xff1a; 达梦没有此功能&#xff0c;但是可以造一个 cd /home/dmdba cat >err.sql<<eof set echo off set ver off set timing off set lineshow off set feedback off select * from V\$ERR_INFO wher…

linux--多进程开发(5)--进程

进程间通讯概念 每两个进程之间都是独立的资源分配单元&#xff0c;不同进程之间不能直接访问另一个进程的资源。 但不同的进程需要进行信息的交互和状态的传递等&#xff0c;因此需要进程间通信&#xff08;IPC,inter processes cimmunication) 进程通信的目的&#xff1a; …

(二)趣学设计模式 之 工厂方法模式!

目录 一、 啥是工厂方法模式&#xff1f;二、 为什么要用工厂方法模式&#xff1f;三、 工厂方法模式怎么实现&#xff1f;四、 工厂方法模式的应用场景五、 工厂方法模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博…

【c语言】字符函数和字符串函数(1)

一、字符分类函数 c语言中有部分函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符&#xff0c;这些函 数的使用要包含一个头文件ctype.h中。 其具体如下图所示&#xff1a; 这些函数的使用方式都类似&#xff0c;下面我们通过一个函数来看其…

网络安全 机器学习算法 计算机网络安全机制

&#xff08;一&#xff09;网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型&#xff1a; 自主访问控制强制访问控制 访问控制措施&#xff1a; 入…

企业级大模型应用的Java-Python异构融合架构实践

一、后端语言相关技术生态 Python语言 Python在AI计算领域拥有全面的生态支持&#xff1a; 底层工具库: Pandas、NumPy、SciPy、Matplotlib深度学习框架: PyTorch、TensorFlow领域专用框架: HuggingFace Transformers&#xff08;社区生态为主&#xff09; 常见Python框架 …

Apache Doris 索引的全面剖析与使用指南

搞大数据开发的都知道&#xff0c;想要在海量数据里快速查数据&#xff0c;就像在星图里找一颗特定的星星&#xff0c;贼费劲。不过别慌&#xff0c;数据库索引就是咱们的 “定位神器”&#xff0c;能让查询效率直接起飞&#xff01;就拿 Apache Doris 这个超火的分析型数据库来…

HTTP/HTTPS 服务端口监测的简易实现

一 HTTP/HTTPS 服务端口监测的简易实现方法 在当今快节奏的工作环境中&#xff0c;工作忙碌成为了许多职场人的常态。就拿我们团队最近经历的事情来说&#xff0c;工作任务一个接一个&#xff0c;大家都在各自的岗位上争分夺秒地忙碌着。然而&#xff0c;就在这样高强度的工作…

基于数据可视化学习的卡路里消耗预测分析

数据分析实操集合&#xff1a; 1、关于房间传感器监测数据集的探索 2、EEMD-LSTM模型择时策略 — 1.EEMD分解与LSTM模型搭建 3、EEMD-LSTM模型择时策略 — 2. 量化回测 4、国际超市电商销售数据分析 5、基于问卷调查数据的多元统计数据分析与预测&#xff08;因子分析、对应分…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表&#xff1f; 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法&#xff08;时间复杂度O(1)&#xff09; 尾插法&#xff08;时间复杂度O(n)&#xff09; 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

计算机网络:应用层 —— 电子邮件

文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件&#xff08;E-mail&#xff09;是因特网上最早…

AWVS(web)扫描器安装与使用

目录 前言 1. AWVS 简介与功能特性 1.1 什么是 AWVS&#xff1f; 1.2 主要功能特性 2. AWVS 的安装步骤 2.1 系统要求 2.2 安装步骤&#xff08;以 Windows 为例&#xff09; 3. 配置与初始化 3.1 设置扫描目标 3.2 配置扫描选项 4. AWVS 的使用方法 4.1 自动扫描 …

opencv的C++遇到找不到opencv_worldxxxd.dll

如图所示&#xff1a; 将你缺的这个dll文件复制到 C:\Windows\System32 即可

AI提示工程的挑战与演进

目前让AI按照工作流正确的工作依然存在着提示挑战&#xff0c;提示工程实际上是一套逻辑严密的工作。 根据当前技术发展及行业实践&#xff0c;AI按照工作流正确执行任务仍面临显著的提示工程挑战&#xff0c;而提示工程本身也正在从零散经验向系统化、逻辑严密的方法论演进。以…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

蓝桥杯第十六届嵌入式模拟编程题解析

由硬件框图可以知道我们要配置LED 和按键 LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&#xf…