查询cpp-netlib HTTP服务器的请求

querying the request of cpp-netlib HTTP server

一个类似于(但比)这个 的问题。

这是在 Linux/Debian/Sid/x86-64 上使用 cpp-netlib 0.11.1clang++ 3.5 或 g++ 4.9 在 -std=c++11 模式下。

顺便说一句,我也在 cpp-netlib googlegroup 上问了一些例子 ...

#include <fstream>
#include <iostream>
#include <boost/network/protocol/http/server.hpp>
#define DEBUG_OUT(Out) do {std::cout << __FILE__ << ":" << __LINE__ \
   << ' ' << Out << std::endl;} while(0)

namespace netlib_http = boost::network::http;

struct Yaca_web;
typedef netlib_http::server<Yaca_web> Yaca_server;

struct Yaca_web {
  void operator() (Yaca_server::request const& request,
                   Yaca_server::response &response)
  {
    DEBUG_OUT("web request source="
          << std::string(source(request))
          //<< " uri=" << std::string(uri(request)) ///@@@@@
          );
  };
  void log(const std::string&s) { DEBUG_OUT("log s=" << s); };
};              // end Yaca_web

void ya_web_service(int port) {
  DEBUG_OUT("ya_web_service start port=" << port);
  Yaca_web webhandler;
  Yaca_server::options weboptions {webhandler};
  weboptions.address("localhost");
  weboptions.port(std::to_string(port));
  weboptions.reuse_address(true);
  Yaca_server webserver {weboptions};
  DEBUG_OUT("ya_web_service before running server");
  webserver.run();
  DEBUG_OUT("ya_web_service end port=" << port);
}    

如果我取消注释 ///@@@@@ 的行,上面的代码不会编译,但我使用 uri(request) 作为盲目猜测:

In file included from ywebx.cc:4:
In file included from /usr/include/boost/network/protocol/http/server.hpp:13:
In file included from /usr/include/boost/network/protocol/http/request.hpp:18:
/usr/include/boost/network/protocol/http/message/wrappers/uri.hpp:25:44: error: 
      no member named 'uri' in
      'boost::network::http::basic_request<tags::http_server>'
  operator string_type() { return message_.uri().raw(); }
                                  ~~~~~~~~ ^
ywebx.cc:18:34: note: in instantiation of member function
      'boost::network::http::impl::uri_wrapper<boost::network::http::tags::http_server>::operator
      basic_string' requested here
              << " uri=" << std::string(uri(request))
                                        ^
./yacax.h:49:18: note: expanded from macro 'DEBUG_OUT'
       << ' ' << Out << std::endl;} while(0)
             ^

有谁知道如何获取更多信息:特别是方法、路径或 URI,以及 HTTP POST requests with the common application/x-www-form-urlencoded MIME type 网络表单参数的字典(如果可能)?

我找不到 Web 表单的 cpp-netlib HTTP 服务的简单示例(类似于 examples/post/ of libonion 的 C++11 中的 cpp-netlib

可以从服务器的请求中得到以下字段object(https://github.com/cpp-netlib/cpp-netlib/blob/0.11-devel/boost/network/protocol/http/impl/request.hpp#L126):

  • request.destination -- 一个字符串,即"uri"
  • request.method -- 方法,"POST","GET",等等
  • request.headers -- header object 的向量,具有 .name 和 .value 成员
  • request.body -- 请求的body,全部in.

如果您使用的是服务器 API 的异步版本,您还可以按照 http://cpp-netlib.org/0.11.1/reference/http_server.html#connection-object 中的文档获取 body 流式传输——这允许您阅读传入请求的 body 块,然后通过设置响应状态、添加 headers 等来响应

在你的例子中,你可以通过这样做得到你想要的:

struct Yaca_web {
  void operator()(Yaca_server::request const& req,
                  Yaca_server::response& res) {
    DEBUG_OUT("web request source="
      << std::string(source(request))
      << " uri=" << std::string(destination(request)) ///@@@@@
      );
  }
};

或者,直接使用 objects:

struct Yaca_web {
  void operator()(Yaca_server::request const& req,
                  Yaca_server::response& res) {
    DEBUG_OUT("web request source="
      << req.source
      << " uri=" << req.destination
      );
  }
};