发表时间:2022-03-25来源:网络
最近的一些开发,需要用到http服务,大致是两种,一种是我们算法端起http服务,等到后端发送消息给算法,然后算法去解析消息,得到我们要的图像数据;第二种是,我们算法端处理完图像之后,需要将结果发送给后端,那么如果是后端发送给我们的,其实可以将处理完的结果返回即可;但也有一种情况是,需要我们算法去给后端发消息的。
所以这其中就涉及两种情形:第一种是算法起服务,第二种是算法发送http请求。
如果算法使用的是Python,那么起算法服务可以使用Flask这个库,如果是算法要发送http请求,那么可以使用requests这个库,也可以很方便的实现。但是如果算法是C++来写的,那么就可以考虑将算法封装成库,然后给后端调用,如果后端是python,那么可以将C++编写的算法封装成so或者dll库,然后python通过ctypes导入C++的动态库来调用,Java则是通过JNI调C++,C#也是通过调C++的动态库实现调C++的。但是,也可以类似Python一样,起算法服务,来接收http请求。这个时候就需要C++来写web服务了。这方面,其实C++也有很多web库的,但是可能用起来就没有python的库那么容易了。
crow是一个github上找到的开源的C++web框架,这个框架是受python下的Flask启发的,github上的介绍是:
Crow is C++ microframework for web. (inspired by Python Flask)
可见其估计功能和用法应该是和Python的Flask应该是类似的哈。该工程的结构其实也挺简单的,核心的代码都写在include中的头文件中,因此下载下来也不需要编译成库,直接include头文件即可使用,当然后期我觉得还是可以将代码的声明和定义分离,封装成库,方便调用,这样每次编译新的应用的时候都需要重新编译还是比较繁琐的。
接下来就根据crow提供的例子来写一下,这个框架是怎么使用的。首先是要起服务,然后去监听某个端口的消息。用crow实现如下:

这样我的web服务就起来了,但是也看到这样是没有消息处理的,只是监听消息,而不对任何消息做处理,那么后端给发消息的时候就会出错。接下来就记录下个各种消息的处理。
这种常见的是应该是一些我们不需要发送什么参数,只是需要从服务端获取一些信息的情况,比如服务的证据状态等。这种多数时候是一个默认的服务,常见get一个ip加端口,或者有不同的信息就给不同的字段。比如我要其一个服务,然后后端需要监控我的服务是否还健在,那么我就可以给一个默认服务或者给一个health的服务,当后端get这个地址,如果我的服务还在,就给后端返回ok等信息。实现代码也比较简单,如下:
int main() { crow::SimpleApp app; CROW_ROUTE(app, "/")([](){ return "Hello world!"; }); CROW_ROUTE(app, "/health")([](){ return "OK"; }); app.port(8888).multithreaded().run(); return 0; }Python端的发送消息的代码如下:
import requests def send_health(): url_get = "http://localhost:8888/" r = requests.get(url_get) print(r.text) if __name__ == '__main__': send_health()
这样如果C++服务端收到消息,就会返回对应的信息给Python端。
有时候,我们需要返回的消息会比较多,那么我们可能会指定那个字段上会有什么消息,这样得到返回的消息后,就会去解析消息,取到所需要的字段上的信息即可,不是需要的字段则可以不去管它。C++服务端的实现代码如下:
CROW_ROUTE(app, "/json") ([]{ crow::json::wvalue x; x["msg"] = "Hello, World!"; return x; });Python端的发送消息的代码如下:
def send_get_json(): url_get = "http://localhost:8888/json" r = requests.get(url_get) print(r.text) str_json = json.loads(r.text) print(str_json["msg"])
这种情况与1.2的类似,只不过这一次反过来,我们服务端可能会收到很多参数,但是我们只解析我们需要的字段的消息即可,所以就要接收json格式的数据,同样C++端实现如下:
CROW_ROUTE(app, "/add_json") .methods("POST"_method) ([](const crow::request& req){ auto x = crow::json::load(req.body); if (!x) return crow::response(400); int sum = x["a"].i()+x["b"].i(); std::ostringstream os; os
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14