¿Hay alguna manera de hacer fácilmente una solicitud HTTP con C ++? Específicamente, quiero descargar el contenido de una página (una API) y verificar el contenido para ver si contiene un 1 o un 0. ¿También es posible descargar el contenido en una cadena?
c++
httprequest
Sam152
fuente
fuente
Respuestas:
Yo tuve el mismo problema. libcurl está realmente completo. Hay un curlpp de envoltura de C ++ que podría interesarle cuando solicite una biblioteca de C ++. neon es otra biblioteca de C interesante que también admite WebDAV .
curlpp parece natural si usas C ++. Hay muchos ejemplos proporcionados en la distribución fuente. Para obtener el contenido de una URL, haga algo como eso (extraído de ejemplos):
Vea el
examples
directorio en la distribución de fuentes de curlpp , hay muchos casos más complejos, así como uno simple y mínimo completo con curlpp.mis 2 centavos ...
fuente
os << myRequest.perform();
conmyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
dio resultados. Asegúrese de no usarhttp://example.com
, esto devolverá una página vacía. Mejor uso, por ejemplohttp://www.wikipedia.org
.Código de Windows:
Aquí hay una implementación mucho mejor:
fuente
GET / HTTP/1.1.1/... etc
)? ¿Cómo sé cómo formatear lo que envío?Actualización 2020: tengo una nueva respuesta que reemplaza esta, ahora de 8 años, una: https://stackoverflow.com/a/61177330/278976
En Linux, probé cpp-netlib, libcurl, curlpp, urdl, boost :: asio y consideré Qt (pero lo rechacé según la licencia). Todos estos estaban incompletos para este uso, tenían interfaces descuidadas, tenían poca documentación, no se mantenían o no admitían https.
Luego, por sugerencia de https://stackoverflow.com/a/1012577/278976 , probé POCO. Wow, desearía haber visto esto hace años. Aquí hay un ejemplo de cómo hacer una solicitud HTTP GET con POCO:
https://stackoverflow.com/a/26026828/2817595
POCO es gratis, de código abierto (licencia de refuerzo). Y no, no tengo ninguna afiliación con la empresa; Realmente me gustan sus interfaces. Buen trabajo chicos (y chicas).
https://pocoproject.org/download.html
Espero que esto ayude a alguien ... me tomó tres días probar todas estas bibliotecas.
fuente
Se está desarrollando un envoltorio de rizos más nuevo y menos maduro llamado C ++ Requests . Aquí hay una simple solicitud GET:
Es compatible con una amplia variedad de verbos HTTP y opciones de rizo. Hay más documentación de uso aquí .
Descargo de responsabilidad: soy el mantenedor de esta biblioteca .
fuente
Aquí está mi envoltorio mínimo alrededor de cURL para poder obtener una página web como una cadena. Esto es útil, por ejemplo, para pruebas unitarias. Básicamente es un contenedor RAII alrededor del código C.
Instale "libcurl" en su máquina
yum install libcurl libcurl-devel
o equivalente.Ejemplo de uso:
Implementación de clase:
fuente
libCURL es una muy buena opción para ti. Dependiendo de lo que necesite hacer, el tutorial debe decirle lo que desea, específicamente para el manejo fácil. Pero, básicamente, puedes hacer esto solo para ver el origen de una página:
Creo que esto hará que el resultado se imprima en stdout. Si desea manejarlo, lo cual, supongo que sí, debe configurar CURL_WRITEFUNCTION. Todo eso está cubierto en el tutorial de curl vinculado anteriormente.
fuente
Como desea una solución C ++, puede usar Qt . Tiene una clase QHttp que puedes usar.
Puedes consultar los documentos :
Qt también tiene mucho más que podrías usar en una aplicación C ++ común.
fuente
QNetworkAccessManager
ha sido documentado desde Qt 4.4; y en Qt 4.8 dice:QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
así que supongo que todavía está disponible, si ignoras las advertencias obsoletas.Es posible que desee comprobar C ++ REST SDK (nombre en clave "Casablanca"). http://msdn.microsoft.com/en-us/library/jj950081.aspx
Con C ++ REST SDK, puede conectarse más fácilmente a los servidores HTTP desde su aplicación C ++.
Ejemplo de uso:
El SDK de C ++ REST es un proyecto de Microsoft para la comunicación cliente-servidor basada en la nube en código nativo utilizando un diseño moderno y asíncrono de API C ++.
fuente
Con esta respuesta, me refiero a la respuesta de Software_Developer . Al reconstruir el código, descubrí que algunas partes están en desuso (
gethostbyname()
) o no proporcionan manejo de errores (creación de sockets, envío de algo) para una operación.El siguiente código de Windows se prueba con Visual Studio 2013 y Windows 8.1 de 64 bits, así como con Windows 7 de 64 bits. Apuntará a una conexión TCP IPv4 con el servidor web de www.google.com.
Referencias
Desuso de gethostbyname
Valor de retorno de socket ()
Valor de retorno de send ()
fuente
C ++ no proporciona ninguna forma de hacerlo directamente. Dependería por completo de las plataformas y bibliotecas que tenga.
En el peor de los casos, puede usar la biblioteca boost :: asio para establecer una conexión TCP, enviar los encabezados HTTP (RFC 2616) y analizar las respuestas directamente. Mirando las necesidades de su aplicación, esto es bastante simple de hacer.
fuente
Aquí hay un código que funcionará sin necesidad de usar ninguna biblioteca de terceros: Primero defina su puerta de enlace, usuario, contraseña y cualquier otro parámetro que necesite enviar a este servidor específico.
Aquí está el código en sí:
Eso debería funcionar en un entorno API Win32.
Aquí hay un ejemplo .
fuente
InternetConnect
devuelve nulo cuando se proporciona la URL completa, pero devuelve un valor no nulo cuando solo se proporciona el nombre de dominio. Entonces, ¿cuándo / dónde uso la URL completa para obtener la página que quiero descargar?Respuesta actualizada para abril de 2020:
Recientemente tuve mucho éxito con cpp-httplib (tanto como cliente como servidor). Es maduro y su RPS aproximado de un solo subproceso es de alrededor de 6k.
En una parte más innovadora , hay un marco realmente prometedor, cpv-framework , que puede obtener alrededor de 180k RPS en dos núcleos (y escalará bien con la cantidad de núcleos porque se basa en el marco de Seastar , que alimenta los DB más rápidos en El planeta, scylladb ).
Sin embargo, cpv-framework todavía es relativamente inmaduro; por lo tanto, para la mayoría de los usos, recomiendo cpp-httplib.
Esta recomendación reemplaza mi respuesta anterior (hace 8 años).
fuente
C y C ++ no tienen una biblioteca estándar para HTTP o incluso para conexiones de socket. Con los años se han desarrollado algunas bibliotecas portátiles. El más utilizado, como han dicho otros, es libcurl .
Aquí hay una lista de alternativas a libcurl (proveniente del sitio web de libcurl).
Además, para Linux, este es un cliente HTTP simple. Puede implementar su propio cliente HTTP GET simple, pero esto no funcionará si hay autenticación o redireccionamientos involucrados o si necesita trabajar detrás de un proxy. Para estos casos, necesita una biblioteca completa como libcurl.
Para el código fuente con libcurl, este es el más cercano a lo que desea (Libcurl tiene muchos ejemplos ). Mira la función principal. El contenido html se copiará en el búfer, después de una conexión exitosa. Simplemente reemplace parseHtml con su propia función.
fuente
Puede usar la biblioteca embeddedRest . Es una biblioteca ligera de solo encabezado. Por lo tanto, es fácil incluirlo en su proyecto y no requiere compilación porque no contiene
.cpp
archivos.Solicitar ejemplo
readme.md
de repo:fuente
netdb.h
, etc por lo que me gustaría algunos sí ayuda#ifdef _WIN32
y agregar allí el código específico de Windows. Mire aquí : no hay mucha diferencia entre los sockets de Unix y los sockets de Windows. Veo dos diferencias principales: 1) llamarWSAStartup
primero y 2) usar enclosesocket
lugar declose
El protocolo HTTP es muy simple, por lo que es muy simple escribir un cliente HTTP. Acá hay uno
https://github.com/pedro-vicente/lib_netsockets
Utiliza HTTP GET para recuperar un archivo de un servidor web, tanto el servidor como el archivo son parámetros de línea de comando. El archivo remoto se guarda en una copia local.
Descargo de responsabilidad: soy el autor
EDITAR: URL editada
fuente
¡Tenga en cuenta que esto no requiere libcurl, Windows.h o WinSock! Sin compilación de bibliotecas, sin configuración de proyecto, etc. Tengo este código funcionando en Visual Studio 2017 c ++ en Windows 10:
Acabo de descubrir cómo hacer esto, ya que quería un script simple de acceso a la API, las bibliotecas como libcurl me estaban causando todo tipo de problemas (incluso cuando seguía las instrucciones ...), y WinSock es demasiado bajo y complicado. .
No estoy muy seguro acerca de todo el código de lectura de IStream (particularmente la condición while, siéntase libre de corregirlo / mejorarlo), pero bueno, ¡ funciona , sin problemas! (Tiene sentido para mí que, dado que utilicé una llamada de bloqueo (sincrónica) , está bien, eso
bytesRead
siempre sería> 0U hasta que la secuencia ( ISequentialStream ?) Termine de leerse, pero quién sabe).Ver también: Monikers de URL y referencia de protocolo conectable asíncrono
fuente
Aquí hay un código C ++ 11 (relativamente) simple que usa libCURL para descargar el contenido de una URL en
std::vector<char>
:http_download.hh
http_download.cc
fuente
En general, recomendaría algo multiplataforma como cURL, POCO o Qt. ¡Sin embargo, aquí hay un ejemplo de Windows !:
fuente
Si está buscando una biblioteca de cliente HTTP en C ++ que sea compatible con múltiples plataformas (Linux, Windows y Mac) para consumir servicios web de Restful. Puedes tener las siguientes opciones.
fuente
Aunque un poco tarde. Puede preferir https://github.com/Taymindis/backcurl .
Le permite hacer llamadas http en el desarrollo móvil de c ++. Apto para el desarrollo de juegos móviles
fuente
Puede usar ACE para hacerlo:
fuente