127 votos

¿Cómo se hace una petición HTTP con C++?

¿Hay alguna manera de hacer fácilmente una petición HTTP con C++, hay alguna librería que haga esto. Concretamente, quiero descargar el contenido de una página (una API) y comprobar el contenido para ver si contiene un 1 o un 0. ¿Es posible también descargar el contenido en una cadena?

Las muestras de código serían buenas.

125voto

neuro Puntos 6590

Yo tuve el mismo problema. libcurl es realmente completo. Hay un envoltorio C++ curlpp que podría interesarte mientras pides una biblioteca de C++. neón es otra interesante biblioteca C que también soporta webdav.

Curlpp parece natural si se usa C++. Hay muchos ejemplos siempre y cuando. Para obtener el contenido de una URL se hace algo así (extraído de ejemplos) :

// Edit : rewritten for cURLpp 0.7.3
// Note : namespace changed, was cURLpp in 0.7.2 ...
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>

// RAII cleanup
curlpp::Cleanup myCleanup;

// standard request object.
curlpp::Easy myRequest;

// Set the URL.
myRequest.setOpt(new curlpp::options::Url(std::string("http://www.wikipedia.com")));

// Send request and get a result.
// By default the result goes to standard output.
// Here I use a shortcut to get it in a string stream ...
std::ostringstream os;
os << myRequest.perform();

string asAskedInQuestion = os.str();

mis 2 centavos...

55voto

Software_Developer Puntos 3082

Código de Windows:

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main (){
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        cout << "WSAStartup failed.\n";
        system("pause");
        return 1;
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    host = gethostbyname("www.google.com");
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    cout << "Connecting...\n";
    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
        cout << "Could not connect";
        system("pause");
        return 1;
    }
    cout << "Connected.\n";
    send(Socket,"GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n"),0);
    char buffer[10000];
    int nDataLength;
    while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){        
        int i = 0;
        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            cout << buffer[i];
            i += 1;
        }
    }
    closesocket(Socket);
        WSACleanup();
    system("pause");
    return 0;
}

22voto

Homer6 Puntos 5850

En Linux, probé cpp-netlib, libcurl, curlpp, urdl, boost::asio y consideré Qt (pero lo rechacé por la licencia). Todos ellos estaban incompletos para este uso, tenían interfaces descuidadas, tenían mala documentación, no estaban mantenidos o no soportaban https.

Entonces, por sugerencia de http://stackoverflow.com/a/1012577/278976 Probé con la POCO. Vaya, ojalá hubiera visto esto hace años. Aquí hay un ejemplo de cómo hacer una petición HTTP GET:

http://xjia.heroku.com/2011/09/10/learning-poco-get-with-http/

La POCO es gratuita, de código abierto (licencia de impulso). Y no, no tengo ninguna afiliación con la compañía; sólo me gustan mucho sus interfaces. Buen trabajo chicos (y chicas).

http://pocoproject.org/download/index.html

Espero que esto ayude a alguien... me llevó tres días probar todas estas bibliotecas.

20voto

Éric Malenfant Puntos 10082

Algunas otras posibilidades:

17voto

Gerald Puntos 13865

libcURL es una API bastante ligera y fácil de usar que soporta HTTP.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X