关于使用 C++ 和 poco 从 REST-ful 资源访问数据的问题

Question about accessing data from REST-ful resource using c++ and poco

我已使用 java HttpURL 连接成功检索数据并将请求方法设置为 "GET"。我也想在 C++ 中实现它(我正在使用 poco)。我尝试访问的 URL 是“https://open.faceit.com/data/v4”。

当我发送请求时,我收到状态代码 400(错误请求)和响应消息“400 纯 HTTP 请求已发送到 HTTPS 端口”。为什么在 java 中使用 HTTP 会工作,但在 c++ 中使用 POCO 我会收到此错误?我应该改用 HTTPSClientSession 吗?如果是的话,为什么我能够在 java?

中使用 HTTP

java 给出 return 代码 200

的代码
URL url = new URL(dataURL);
HttpURLConnection hc = (HttpURLConnection) url.openConnection();
hc.setRequestMethod("GET");
hc.setRequestProperty("Authorization", "Bearer " + code);
hc.setDoOutput(true);
int rCode = hc.getResponseCode();

c++ 那就是给我 return 400

Poco::URI uri("https://open.faceit.com/data/v4/players?nickname=FadesfasT&game=CSGO");
std::string path(uri.getPathAndQuery());
HTTPClientSession session(uri.getHost(), uri.getPort());
HTTPRequest request(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
request.add("Authorization", "Bearer" + token);
request.setContentType("application/json");
session.sendRequest(request);
HTTPResponse response;
std::istream& in_stream = session.receiveResponse(response);
std::ostringstream out_stream;
Poco::StreamCopier::copyStream(in_stream, out_stream);
std::cout << out_stream.str() << std::endl;

您的 C++ 代码段的问题在于您将包含 HTTPS 地址的 URL 与针对 HTTP 的请求混合在一起。

我对为什么问题没有出现在 Java 中没有根据的猜测是它识别地址中的 'https' 并自动为此使用适当的处理程序。事实上,在 C++ 中或至少在 POCO 中,您必须自己选择合适的请求。

基本上你有3个选择:

  1. 对您已经编写的 HTTP 请求使用 HTTP URL。
    这似乎不是一个真正的选择,因为您的 URL 将 HTTP 重定向到 HTTPS,所以这行不通。
  2. 使用 HTTPS URL 并将您的请求更改为 HTTPS。它可能比选项 1 更难,但 并不难,并且存在 SO question discussing this。总结:

    Should I be using HTTPSClientSession instead [...] ?

    是的,如果您决定使用此选项

  3. 使用 POCO 以外的库,这似乎是您的情况的解决方案,如评论中所述。例如,我知道 CURL and libhttp,如果不是更容易的话,它至少和 POCO 一样容易使用。这些链接指向包含有关如何执行 HTTPS 请求的示例的页面。