关于使用 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个选择:
- 对您已经编写的 HTTP 请求使用 HTTP URL。
这似乎不是一个真正的选择,因为您的 URL 将 HTTP 重定向到 HTTPS,所以这行不通。
使用 HTTPS URL 并将您的请求更改为 HTTPS。它可能比选项 1 更难,但 并不难,并且存在 SO question discussing this。总结:
Should I be using HTTPSClientSession instead [...] ?
是的,如果您决定使用此选项
使用 POCO 以外的库,这似乎是您的情况的解决方案,如评论中所述。例如,我知道 CURL and libhttp,如果不是更容易的话,它至少和 POCO 一样容易使用。这些链接指向包含有关如何执行 HTTPS 请求的示例的页面。
我已使用 java HttpURL 连接成功检索数据并将请求方法设置为 "GET"。我也想在 C++ 中实现它(我正在使用 poco)。我尝试访问的 URL 是“https://open.faceit.com/data/v4”。
当我发送请求时,我收到状态代码 400(错误请求)和响应消息“400 纯 HTTP 请求已发送到 HTTPS 端口”。为什么在 java 中使用 HTTP 会工作,但在 c++ 中使用 POCO 我会收到此错误?我应该改用 HTTPSClientSession 吗?如果是的话,为什么我能够在 java?
中使用 HTTPjava 给出 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个选择:
- 对您已经编写的 HTTP 请求使用 HTTP URL。
这似乎不是一个真正的选择,因为您的 URL 将 HTTP 重定向到 HTTPS,所以这行不通。 使用 HTTPS URL 并将您的请求更改为 HTTPS。它可能比选项 1 更难,但 并不难,并且存在 SO question discussing this。总结:
Should I be using HTTPSClientSession instead [...] ?
是的,如果您决定使用此选项
使用 POCO 以外的库,这似乎是您的情况的解决方案,如评论中所述。例如,我知道 CURL and libhttp,如果不是更容易的话,它至少和 POCO 一样容易使用。这些链接指向包含有关如何执行 HTTPS 请求的示例的页面。