使用 C++ curl 库 libCPR 获取 0 的 HTTP 响应状态代码和空消息
Getting an HTTP response status code of 0 and empty message using C++ curl library libCPR
我正在使用 libcpr 发送 GET 请求。
cpr::Response r = cpr::Get(
cpr::Url{target.str()},
cpr::Header{header});
为了调试,我打印了响应——
std::cout << "Response Error: " << r.error.message << std::endl;
std::cout << "Response Error Code: " << (int)r.error.code << std::endl;
std::cout << "Response Status Code: " << r.status_code << std::endl;
std::cout << "Response Text: " << std::endl;
——得到以下内容:
Response Error:
Response Error Code: 4
Response Status Code: 0
Response Text:
我在网上看到很多看似相关的话题,但我觉得我已经尝试了所有方法,但我不知道我的具体问题是什么。我认为更精通 curl、CMake 或 OpenSSL 的人可能能够发现它。所以这是我尝试/知道的:
我不认为这是我的代码本身的问题——更可能是我的设置问题(依赖项、选项等)因为该代码适用于不同的目标,i.e. 我可以点击“https://api.binance.us/api”并获得 200 和我期望的响应。这是针对目标“https://api.exchange.coinbase.com”和“https://api.kucoin.com/api”,给我一个 0 和空响应。
我可以使用 Postman 获得真实的响应。 当我 std::cout 请求 headers 发送相同的请求时使用 Postman,我确实得到了回复:
(别担心,我已经修改了值。)
对于 Windows 用户,今年早些时候 a thread 有一个关于 HTTPS 请求的问题,源于 vcpkg 的问题。我使用的是 macOS Big Sur (11.6.5),所以这不是我的问题。
就在 1 个月前 a thread that seems relevant. 17 days ago they appear to have "fixed" this issue (PR #733)——所以我已将 CMake 指向最新版本的 libcpr,1.8.3:
include(FetchContent)
FetchContent_Declare(
cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git
GIT_TAG db351ffbbadc6c4e9239daaa26e9aefa9f0ec82d) # 1.8.3
FetchContent_MakeAvailable(cpr)
target_link_libraries(myProgram PRIVATE cpr::cpr)
我还是不行。
以下是 CMake 输出的内容,以防其中有我看不到的提示:
-- Enabled curl SSL
-- curl version=[7.80.0]
-- Could NOT find LibSSH2 (missing: LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR)
-- CA path only supported by OpenSSL, GnuTLS or mbed TLS. Set CURL_CA_PATH=none or enable one of those TLS backends.
-- Enabled features: SSL IPv6 unixsockets libz AsynchDNS Largefile alt-svc HSTS
-- Enabled protocols: HTTP HTTPS
-- Enabled SSL backends: Secure Transport
-- Configuring done
-- Generating done
多个线程说 7.81.0
之前的版本工作正常。
我也试过添加选项 cpr::VerifySsl{false}
,但回来了
SSL peer handshake failed, the server most likely requires a client certificate to connect
无论如何我觉得那不是正确的道路。
有人有想法吗?任何其他可能有用的输出或尝试的东西?
当然是最简单的,我没试过。这个警告让我失望:
-- Could NOT find LibSSH2 (missing: LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR)
我只是做了一个 brew install libssl2
,现在可以用了。
我正在使用 libcpr 发送 GET 请求。
cpr::Response r = cpr::Get(
cpr::Url{target.str()},
cpr::Header{header});
为了调试,我打印了响应——
std::cout << "Response Error: " << r.error.message << std::endl;
std::cout << "Response Error Code: " << (int)r.error.code << std::endl;
std::cout << "Response Status Code: " << r.status_code << std::endl;
std::cout << "Response Text: " << std::endl;
——得到以下内容:
Response Error:
Response Error Code: 4
Response Status Code: 0
Response Text:
我在网上看到很多看似相关的话题,但我觉得我已经尝试了所有方法,但我不知道我的具体问题是什么。我认为更精通 curl、CMake 或 OpenSSL 的人可能能够发现它。所以这是我尝试/知道的:
我不认为这是我的代码本身的问题——更可能是我的设置问题(依赖项、选项等)因为该代码适用于不同的目标,i.e. 我可以点击“https://api.binance.us/api”并获得 200 和我期望的响应。这是针对目标“https://api.exchange.coinbase.com”和“https://api.kucoin.com/api”,给我一个 0 和空响应。
我可以使用 Postman 获得真实的响应。 当我 std::cout 请求 headers 发送相同的请求时使用 Postman,我确实得到了回复:
(别担心,我已经修改了值。)
对于 Windows 用户,今年早些时候 a thread 有一个关于 HTTPS 请求的问题,源于 vcpkg 的问题。我使用的是 macOS Big Sur (11.6.5),所以这不是我的问题。
就在 1 个月前 a thread that seems relevant. 17 days ago they appear to have "fixed" this issue (PR #733)——所以我已将 CMake 指向最新版本的 libcpr,1.8.3:
include(FetchContent) FetchContent_Declare( cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git GIT_TAG db351ffbbadc6c4e9239daaa26e9aefa9f0ec82d) # 1.8.3 FetchContent_MakeAvailable(cpr) target_link_libraries(myProgram PRIVATE cpr::cpr)
我还是不行。
以下是 CMake 输出的内容,以防其中有我看不到的提示:
-- Enabled curl SSL -- curl version=[7.80.0] -- Could NOT find LibSSH2 (missing: LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR) -- CA path only supported by OpenSSL, GnuTLS or mbed TLS. Set CURL_CA_PATH=none or enable one of those TLS backends. -- Enabled features: SSL IPv6 unixsockets libz AsynchDNS Largefile alt-svc HSTS -- Enabled protocols: HTTP HTTPS -- Enabled SSL backends: Secure Transport -- Configuring done -- Generating done
多个线程说
7.81.0
之前的版本工作正常。我也试过添加选项
cpr::VerifySsl{false}
,但回来了SSL peer handshake failed, the server most likely requires a client certificate to connect
无论如何我觉得那不是正确的道路。
有人有想法吗?任何其他可能有用的输出或尝试的东西?
当然是最简单的,我没试过。这个警告让我失望:
-- Could NOT find LibSSH2 (missing: LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR)
我只是做了一个 brew install libssl2
,现在可以用了。