7

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

查询的一个例子是这样的(我现在只使用 GET,其余的 HTTP 动词稍后会出现):

GET /items -> returns a list of all items in JSON
GET /item/by/handle/123456789 -> returns item that has handle 123456789
GET /item/by/name/My%20Item -> returns item(s) that have the name "My Item"

我很好奇我应该如何实现这些查询的解析。我可以轻松解析第一个,因为它只是if( query.getURI() == "/items") return ....
但是对于接下来的两个查询,我必须以std::一种完全不同的方式来操作字符串,使用一些std::string::find()魔法和偏移来获取参数。

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

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 ));

这可能吗?

4

3 回答 3

5

一个相当不性感但简单的方法是简单地使用 sscanf。请原谅类似 C 的代码。请注意,这不提供您正在寻找的那种语法,但它不需要任何库、扩展或增强。

例如,

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
}
于 2012-02-05T17:56:15.070 回答
1

github上的项目drogon(<a href="https://github.com/an-tao/drogon" rel="nofollow noreferrer">project Drogon,a c++11 web framework)可能对你有帮助。在这个框架中,您可以像这样注册您的处理程序方法:

drogon::HttpAppFramework::registerHttpApiMethod("/api/v1/handle/{1}/{2}",yourMethod...);

yourMethod也许任何可调用的对象。

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

希望对你有帮助。。

于 2018-06-07T02:51:12.430 回答
0

在搜索一些 Python 代码时,我发现Flask Web 框架有一种特殊的解析 REST 路径的方式

您声明这样的路径:

@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

Flask 构建了所需的内容,为您提供所需的整数。

这正是我所需要的,所以我想我必须自己用 C++ 来做。
我会得到汤姆的答案,因为它是相关的,我想我的实现看起来有点像他建议的(尽管我更喜欢 iostreams)。

我会把这个答案留给任何潜伏的人。

于 2012-02-20T14:35:09.123 回答