C++ & ngrest Restful服务器开发攻略

前言

C++课设选用了一个比较坑的主题,前后端开发一个网络小游戏,但是必须要使用到C++,只能从后端做文章。理论上来说只需要用C++实现了rest风格的web service就能解决我们的问题,但是怎么用c++这样一个相对于java python不是那么适合web服务的语言来说,如何实现一个rest后端成了难题。这篇文章主要介绍使用ubuntu+ngrest来进行rest服务的开发,这方面的教程网络上较少,很多都是靠自己试探摸索出来的。

 

开发环境准备

· ubuntu服务器一台(云服务器最方便团队协作,也可以通过本地公网映射)

· cmake + gcc + build-essential(cpp编译环境) + git

· ngrest(git上开源的C++ rest框架)

 

实现步骤

 

1.在自己的ubuntu上安装ngrest

首先为什么不使用操作习惯的windows系统呢?因为使用cmake和makefile的编译过程实在太痛苦了,六个小时试验也没有解决了win10系统里面编译的报错问题,stackoverflow找到的解决方案都无济于事,最终选择了ubuntu系统。

首先访问ngrest在git的仓库:https://github.com/loentar/ngrest

可以查看到其官方文档,有给出安装方法

但是这个方法安装ngrest,我切换了许多环境,都是相同的结果,输入未响应好久,然后退出,什么都没有发生。

因此只能采用自己下载源码编译的方法,在ubuntu终端输入以下代码

git clone https://github.com/loentar/ngrest.git
cd ngrest
mkdir build
cd build
cmake ../../ngrest
make

如果没有上面所需工具:git/cmake,请输入

apt install git
apt install cmake

如果提示找不到包,那么需要手动加入阿里源,添加后输入

apt-get upgrade

更新安装仓库源,之后就可以正常安装了。

成功make之后应该得到的目录是这样的:

这样就初步完成了ngrest的编译工作。

 

2.部署服务到指定ip地址与端口

在/ngrest/build/deploy/bin当中可以部署官方提供的样例服务

在此之前我们需要知道本机的ip地址,由于编者使用的是阿里云ECS,设置地址为127.0.0.1或者localhost均无效,最后发现需设置为本机的ip地址才可以正确运行,输入

ifconfig

红框圈住的即为本机ip地址,可以通过以下指令完成服务部署

./ngrestserver -l ***.***.***.*** -p ****
#其中-l后为本机ip地址,ip为制定端口号
#或者可以使用默认配置,ip为localhost,端口为9098
./ngrestserver

这是正常部署后的情况,如果使用的是自己的虚拟机或者双系统ubuntu,直接通过浏览器输入url就可以访问到服务详情主页,如果使用ECS,那么需要添加安全组,将9098这一端口暴露出来

这样就完成了服务的部署与发现,相对于其他框架算是十分简便了。

 

3.开发自己的服务

这里编者参考一篇难得的教程,和官方文档一致,都是直接通过ngrest create指令就可以创建新的工程来开发自己的服务,而在第一步编译工作当中,并没有全局安装ngrest在系统当中,这一步就出现了问题,而在/ngrest/scripts当中我们发现是存在一个可执行文件ngrest的,使用

./ngrest create project

理论上来说应该是可行的,而实践过程中会报错,显示第n行当中有一个指令未找到,这时候就需要全局安装ngrest来解决这个问题了,之后也是可以直接使用ngrest的命令来在任意目录新建工程了,相当于一个脚手架工具,全局安装只需要在/ngrest/scripts目录下执行inst即可

./inst

下面是安装成功后的截图

可以使用ngrest help来检查安装是否成功。

在你要建立工程的目录下输入

ngrest create project_name

即可创建名为project_name的工程,这里我们建造了一个hello工程。

访问到最内层目录发现有默认生成的一个头文件与实现文件

通过vim编辑器打开hello.h,即可定义自己服务的接口,在cpp当中写具体实现代码,这一部分在官方文档较为详细,建议直接阅读官方文档:https://github.com/loentar/ngrest

需要注意的是,定义接口类型是通过注释的方式定义的,如图

*method代表方法类型,*location代表路径参数,类名对应实际服务的根路径名,location可以设置具体路径与路径参数

如hello类中的echo对应路径为http://localhost:9098/hello/{text}

add对应路径为http://localhost:9098/hello/post/{text}

定义接口后在cpp当中编写具体实现代码,之后退出到项目根目录hello,输入以下命令部署服务:

export NGREST_SERVER_IP="***.***.***.***"
#引号中填写本机ip地址
ngrest run

成功部署后如图

通过浏览器访问自己发布服务的默认页面 http://ip:9098/ngrest/services,编者使用ECS,故ip直接使用公网ip就可以访问

提供服务描述页面和简单的测试页面,可以通过postman模拟get与post请求得到返回结果,不作演示了

 

可能遇到的问题

异常结束服务器进程可能会导致僵尸进程的产生,占用端口和内存资源,这时可以使用ps -a/ ps -ef的指令找到僵尸进程的pid,使用kill -9 pid指令来强制结束进程,欢迎评论区留言!

 

2020.7.24更新

1.ngrest框架有自带的数据库框架ngrest-db,但是很遗憾没有提供出连接mysql的具体文档,官方项目组也停止更新两三年了,谷歌社区的最近发言也是定格在了2018年,内容也还是安装的问题。不过还是可以根据他的框架定义一个本地存储的简单数据库的,配合框架使用是比较方便的。

2. 避免不开的跨域请求问题,这一问题目前并没有人解决过,编者将会尝试解决这一问题,后续亟待跟进...

2021.1.11更新

跨域请求应该可以通过nginx转发解决,考完试试一下

 

RESTful接口开发是一种基于REST原则的接口设计和开发方式。REST是Representational State Transfer的缩写,是一种软件架构风格,适用于分布式系统和互联网应用。 在RESTful接口开发中,使用HTTP协议作为通信协议,通过不同的HTTP方法来实现对资源的操作。常用的HTTP方法有GET、POST、PUT、DELETE等,分别用于获取资源、创建资源、更新资源和删除资源。 在开发RESTful接口时,需要定义资源的URI(统一资源标识符),通常使用名词作为URI的一部分,例如/posts表示博客文章资源。URI可以通过路径参数传递参数,例如/posts/{id}表示获取指定id的博客文章。 开发RESTful接口还需要定义资源的表示,通常使用JSON或XML格式进行数据传输。JSON是一种轻量级的数据交换格式,易于解析和生成。通过定义资源的数据结构和字段,可以实现数据的增删改查。 RESTful接口开发的优点是简单、灵活和可扩展。接口的定义清晰,易于理解和使用。通过合理设计URI和使用恰当的HTTP方法,可以实现对资源的有限操作。此外,接口的返回结果通常采用状态码和错误信息的形式,方便前端和后端进行错误处理和调试。 总之,RESTful接口开发是一种常见且有效的方式,用于实现不同系统之间的数据交互和资源操作。它的设计原则简单明了,易于实现和使用,使得系统的结构清晰、接口风格一致。在互联网应用和分布式系统中,RESTful接口开发具有重要的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值