在C ++中获取URL的http响应

时间:2016-08-10 23:37:26

标签: c++ url httpresponse http-response-codes

我想简单地在C ++中获取HTTP响应或简单传递/失败

类似于我在JavaScript中使用的AJAX调用

$.ajax({
    url: "http://www.google.com",
    dataType: "html",
    timeout: 4 * 1000
}).done(function() {

})
.fail(function() {

});

我认为解决方案的一半似乎太复杂了。寻找一种更简单的方法。

3 个答案:

答案 0 :(得分:0)

您可能需要查看CPR库:

auto response = cpr::Get // or cpr::Head
(
    cpr::Url{"http://www.google.com"},
    cpr::Header{{"accept", "text/html"}},
    cpr::Timeout{4 * 1000}
);

if(response.status_code != 200)
{
    // fail
}

答案 1 :(得分:0)

查看libcurl,例如:

#include <curl/curl.h> 

CURL *c = curl_easy_init(); 
if (!c)
{
    ...
}
else
{
    struct curl_slist *headers = curl_slist_append(NULL, "Accept: text/html");

    curl_easy_setopt(c, CURLOPT_URL, "http://www.google.com");
    curl_easy_setopt(c, CURLOPT_HTTPHEADER, headers); 
    curl_easy_setopt(c, CURLOPT_TIMEOUT, 4 * 1000);
    curl_easy_setopt(c, CURLOPT_NOBODY, 1);

    CURLcode res = curl_easy_perform(c);
    curl_slist_free_all(headers);

    if (res != CURLE_OK)
    {
        ...
    }
    else
    {
        long responseCode;
        curl_easy_getinfo(c, CURLINFO_RESPONSE_CODE, &responseCode); 

        ...
    }

    curl_easy_cleanup(c);
}

答案 2 :(得分:0)

在某些情况下,我使用了HappyHTTP,因为它很小且易于使用。它有点受限,但根据您的需要,它可以完成工作。

我稍微更改了他们的示例程序,让您了解如何将它用于您的目的:

// invoked when response headers have been received
void OnBegin( const happyhttp::Response* r, void* userdata )
{
     *userdata = r->getstatus();
}

// invoked to process response body data (may be called multiple times)
void OnData( const happyhttp::Response* r, void* userdata, const unsigned char* data, int n )
{

}

// invoked when response is complete
void OnComplete( const happyhttp::Response* r, void* userdata )
{

}


void TestGET()
{
    int returnStatus;
    happyhttp::Connection conn( "www.google.com", 80 );
    conn.setcallbacks( OnBegin, OnData, OnComplete, &returnStatus );

    conn.request( "GET", "/" );

    while( conn.outstanding() ) conn.pump();

    if (returnStatus != 200) printf("FAIL");
    else printf("OK");
}

为了使其在VS2015上运行,您可以使用以下惰性解决方案:将以下内容添加到happyhttp.cpp的开头。

#ifdef WIN32
    #pragma comment(lib, "ws2_32.lib")
    #define strcasecmp _stricmp
    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #define _CRT_SECURE_NO_WARNINGS
#endif