7

Mongoose Web サーバーを使用し、さまざまなクエリのハンドラーを提供して、アプリケーションで REST API を公開したいと考えています。

クエリの例は次のようになります (現時点では 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 ...
しかし、次の 2 つのクエリでは、std::文字列をまったく異なる方法で操作std::string::find()する必要があります。引数に到達するために、魔法とオフセットを使用します。

例として、これは 2 番目のクエリの実装です。

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 に答える
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++ で自分で行う必要があると思います。
関連性があるので、Tom の回答を取得します。私の実装は、彼が示唆するように少し見えると思います (ただし、私は iostream を好む傾向があります)。

この答えは、ここに潜んでいる人に任せます。

于 2012-02-20T14:35:09.123 に答える