C++ 在C+中解析REST查询+;

C++ 在C+中解析REST查询+;,c++,rest,parsing,mongoose-web-server,C++,Rest,Parsing,Mongoose Web Server,我想在我的应用程序上公开一个RESTAPI,使用web服务器并为不同的查询提供处理程序 查询的一个示例如下(我现在只使用GET,其余的HTTP动词将在后面介绍): 我想知道的是我应该如何实现这些查询的解析。我可以很容易地解析第一个,因为这只是一个的问题,如果(query.getURI()==“/items”)返回… 但是对于接下来的两个查询,我必须以完全不同的方式操作std:字符串,使用一些std::string::find()magic和偏移量来获得参数 例如,这是我对第二个查询的实现: si

我想在我的应用程序上公开一个RESTAPI,使用web服务器并为不同的查询提供处理程序

查询的一个示例如下(我现在只使用GET,其余的HTTP动词将在后面介绍):

我想知道的是我应该如何实现这些查询的解析。我可以很容易地解析第一个,因为这只是一个
的问题,如果(query.getURI()==“/items”)返回…

但是对于接下来的两个查询,我必须以完全不同的方式操作
std:
字符串,使用一些
std::string::find()
magic和偏移量来获得参数

例如,这是我对第二个查询的实现:

size_t position = std::string::npos;
std::string path = "/item/by/handle/";

if( (position = query.getURI().find(path) ) != std::string::npos )
{
    std::string argument = query.getURI().substr( position + path.size() );
    // now parse the argument to an integer, find the item and return it
}
如果我想“模板化”这个怎么办;意思:我描述了路径和我期望的参数(一个整数,一个字符串,…);代码是自动生成来处理的吗

Tl;DR:我希望能够处理C++中的REST查询,并沿着以下几行:

registerHandler( "/item/by/handle/[INTEGER]", myHandlerMethod( int ));

这可能吗?

一个相当不性感但简单的方法就是简单地使用sscanf。请原谅这个相当类似C的代码。注意,这并没有提供您想要的那种语法,但它不需要任何库、扩展或boost

比如说,

int param;
int a, b;
char c[255];

/* recall that sscanf returns the number of variables filled */
if( 1 == sscanf( query.getURI(), "/item/by/handle/%d", &param ) ) {

  handler( param );

} else if ( 3 == sscanf( query.getURI(), "/more/params/%d/%d/%s", &a, &b, &c ) ) {

  anotherHandler( a, b, c );

} else {
  // 404
}

在浏览一些Python代码时,我发现web框架有:

您可以这样声明一个路径:

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id
@app.route(“/post/”)
def显示_post(post_id):
#显示具有给定id的帖子,id为整数
返回“Post%d”%Post\u id
Flask建立了所需的数据,为您提供所需的整数

这正是我所需要的,所以我想我必须自己在C++中做。 我会得到Tom的答案,因为它是相关的,我猜我的实现看起来有点像他建议的(尽管我倾向于使用iostreams)


我将把这个答案留给周围的任何人。

github()上的drogon项目可能会对您有所帮助。在此框架中,您可以按如下方式注册处理程序方法:

drogon::HttpAppFramework::registerHttpApiMethod("/api/v1/handle/{1}/{2}",yourMethod...);
yourMethod
可能是任何可调用的对象

HttpApiController
类是一个简单的包装类,允许您使用宏注册函数。项目中有一些示例演示了这些功能的使用


希望对您有所帮助。

听起来您需要正则表达式,如boost或C++11中所述。请注意,使用%s对用户输入是危险的,因为它不检查边界,并且很容易溢出。对于上面的例子,我建议:
sscanf(query.getURI(),“/more/params/%d/%d/%254s”,&a,&b,c)
好的观点。对于那些想要防止这种情况的人来说,Kernighan和派克有一个简单的解决方案:你最终在C++中实现了这个语法吗?如果是,您是否考虑过开源it
drogon::HttpAppFramework::registerHttpApiMethod("/api/v1/handle/{1}/{2}",yourMethod...);