使用 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 的人可能能够发现它。所以这是我尝试/知道的:

  1. 我不认为这是我的代码本身的问题——更可能是我的设置问题(依赖项、选项等)因为该代码适用于不同的目标,i.e. 我可以点击“https://api.binance.us/api”并获得 200 和我期望的响应。这是针对目标“https://api.exchange.coinbase.com”和“https://api.kucoin.com/api”,给我一个 0 和空响应。

  2. 我可以使用 Postman 获得真实的响应。 当我 std::cout 请求 headers 发送相同的请求时使用 Postman,我确实得到了回复:

    (别担心,我已经修改了值。)

  3. 对于 Windows 用户,今年早些时候 a thread 有一个关于 HTTPS 请求的问题,源于 vcpkg 的问题。我使用的是 macOS Big Sur (11.6.5),所以这不是我的问题。

  4. 就在 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)
    

    我还是不行。

  5. 以下是 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 之前的版本工作正常。

  6. 我也试过添加选项 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,现在可以用了。