2016-08-10 3 views
-1

Я хочу, чтобы просто получить ответ HTTP или просто годен/негоден для URL в C++Получить ответ HTTP для URL в C++

Что-то вроде AJAX позвонить я использую в JavaScript

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

}) 
.fail(function() { 

}); 

Половина решений, которые я кажутся слишком запутанными. В поисках более простого способа.

+2

Что вы найти так трудно о [ 'getaddrinfo'] (http://manpages.courier-mta.org/htmlman3/getaddrinfo.3.html)(), а затем [' socket'] (HTTP : //manpages.courier-mta.org/htmlman2/socket.2.html)(), затем ['connect'] (http://manpages.courier-mta.org/htmlman2/connect.2.html) (), затем ['write'] (http://manpages.courier-mta.org/htmlman2/write.2.html)() и, наконец, [' read'] (http: //manpages.courier-mta. орг/htmlman2/read.2.html)()? –

+0

Я согласен @SamVarshavchik больше методов = меньше ошибок, и более конкретно –

+0

@SamVarshavchik Я явно не нашел примера, чистив веб-версию, которая выдвинула это решение. Я посмотрю на него –

ответ

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 
} 
+0

Это, безусловно, похоже на простое решение, которое я искал. Является ли CPR единственной библиотекой, которую я должен импортировать в свой проект? –

+0

@DanJamesPalmer 'CPR' - это« оберточная »библиотека для [CURL] (https://curl.haxx.se/), поэтому вам также необходимо установить [CURL] (https://curl.haxx.se/). – Galik

+0

Для быстрого запуска и запуска cpr включает cURL внутри репозитория в качестве подмодуля. В разделе [Usage] (https://github.com/whoshuu/cpr#usage) должны быть инструкции, которые помогут вам начать работу. Кроме того, вы можете клонировать или разветвлять [пример репозитория] (https://github.com/whoshuu/cpr-example) со всеми необходимыми строительными лебедками CMake, которые вам нужны для простого запроса GET. – huu

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); 
} 
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 
+0

Привет, Ален-Жак, я пытаюсь реализовать ваше предложение. Я загрузил файлы .h и .cpp для HappyHTTP и добавил их в свой проект. Я включил их в файл .cc, который я хочу использовать. При попытке компиляции в VS2015 я получаю следующие ошибки. Есть идеи? https: // postimg.org/image/jz0xu87d1/ –

+0

@DanJamesPalmer, я отредактировал ответ с ленивым решением для вашей проблемы VS2015. Дело в том, что компилятор в основном жалуется на использование небезопасных строковых вызовов и устаревших функций сокетов. Есть более эффективные способы решения этой проблемы, такие как, например, замена sprintf для snprintf, в котором указывается длина буфера, исключающая возможные проблемы с памятью. –

+0

Спасибо Ален-Жаку, который действительно избавился от ошибок. У меня теперь есть новый вопрос. См. Https://postimg.org/image/434d3es11/. Я беру на себя этот проект от кого-то другого. Похоже, что все методы должны быть частью зонтика CSpeedTest. Когда я помещаю методы happyHTTP в этот зонтик, я получаю ошибку. Удаление CSpeedTest разрешает ошибку, но я тогда не могу вызвать CheckACM из других методов .... –