Existe alguma maneira de fazer facilmente uma solicitação HTTP com C ++? Especificamente, quero baixar o conteúdo de uma página (uma API) e verificar o conteúdo para ver se contém 1 ou 0. Também é possível fazer o download do conteúdo em uma string?
c++
httprequest
Sam152
fonte
fonte
Respostas:
Eu tive o mesmo problema. libcurl é realmente completo. Há um curlpp do wrapper C ++ que pode lhe interessar quando você solicita uma biblioteca C ++. neon é outra biblioteca C interessante que também suporta WebDAV .
O curlpp parece natural se você usa C ++. Existem muitos exemplos fornecidos na distribuição de origem. Para obter o conteúdo de um URL, faça algo assim (extraído de exemplos):
Veja o
examples
diretório na distribuição de fontes curlpp , existem muitos casos mais complexos, bem como um mínimo completo e simples usando curlpp.meus 2 centavos ...
fonte
os << myRequest.perform();
pormyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
deu resultados. Certifique-se de não usarhttp://example.com
, isso retornará uma página vazia. Melhor uso, por exemplohttp://www.wikipedia.org
.Código do Windows:
Aqui está uma implementação muito melhor:
fonte
GET / HTTP/1.1.1/... etc
)? Como descubro como formatar o que envio?Atualização 2020: Tenho uma nova resposta que substitui essa, agora com 8 anos, uma: https://stackoverflow.com/a/61177330/278976
No Linux, tentei cpp-netlib, libcurl, curlpp, urdl, boost :: asio e considerei o Qt (mas o diminuí com base na licença). Todos eles estavam incompletos para esse uso, tinham interfaces desleixadas, documentação deficiente, não eram mantidos ou não eram compatíveis com https.
Então, por sugestão de https://stackoverflow.com/a/1012577/278976 , tentei o POCO. Uau, eu gostaria de ter visto isso anos atrás. Aqui está um exemplo de como fazer uma solicitação HTTP GET com o POCO:
https://stackoverflow.com/a/26026828/2817595
O POCO é gratuito, de código aberto (licença de reforço). E não, eu não tenho nenhuma afiliação com a empresa; Eu realmente gosto das interfaces deles. Excelente trabalho pessoal (e moças).
https://pocoproject.org/download.html
Espero que isso ajude alguém ... Levei três dias para experimentar todas essas bibliotecas.
fonte
Está sendo desenvolvido um wrapper de ondulação mais novo e menos maduro, chamado C ++ Requests . Aqui está uma solicitação GET simples:
Ele suporta uma ampla variedade de verbos HTTP e opções de ondulação. Há mais documentação de uso aqui .
Disclaimer: Eu sou o mantenedor desta biblioteca .
fonte
Aqui está meu invólucro mínimo em torno do cURL para conseguir apenas uma página da Web como uma string. Isso é útil, por exemplo, para testes de unidade. É basicamente um wrapper RAII em torno do código C.
Instale "libcurl" na sua máquina
yum install libcurl libcurl-devel
ou equivalente.Exemplo de uso:
Implementação de classe:
fonte
libCURL é uma opção muito boa para você. Dependendo do que você precisa fazer, o tutorial deve dizer o que você deseja, especificamente para o manuseio fácil. Mas, basicamente, você poderia fazer isso apenas para ver a fonte de uma página:
Acredito que isso fará com que o resultado seja impresso em stdout. Se você quiser lidar com isso - o que, eu suponho, você precisa - você precisará definir o CURL_WRITEFUNCTION. Tudo isso é abordado no tutorial de ondulação vinculado acima.
fonte
Como você deseja uma solução C ++, você pode usar o Qt . Tem uma classe QHttp que você pode usar.
Você pode verificar os documentos :
O Qt também possui muito mais do que você poderia usar em um aplicativo C ++ comum.
fonte
QNetworkAccessManager
está documentado desde o quarto trimestre; e no Qt 4.8 diz:QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Acho que ainda está disponível, se você ignorar os avisos preteridos.Convém verificar o C ++ REST SDK (codinome "Casablanca"). http://msdn.microsoft.com/en-us/library/jj950081.aspx
Com o C ++ REST SDK, você pode conectar-se mais facilmente a servidores HTTP a partir do seu aplicativo C ++.
Exemplo de uso:
O C ++ REST SDK é um projeto da Microsoft para comunicação cliente-servidor baseado em nuvem em código nativo usando um design moderno de API C ++ assíncrona.
fonte
Com esta resposta, refiro-me à resposta do Software_Developer . Ao reconstruir o código, descobri que algumas partes estão obsoletas (
gethostbyname()
) ou não fornecem tratamento de erros (criação de sockets, enviando algo) para uma operação.O código do Windows a seguir é testado com o Visual Studio 2013 e Windows 8.1 de 64 bits, além do Windows 7 de 64 bits. Ele terá como alvo uma conexão TCP IPv4 com o servidor Web de www.google.com.
Referências:
Descontinuação de gethostbyname
Valor de retorno do soquete ()
Valor de retorno de send ()
fonte
O C ++ não fornece nenhuma maneira de fazê-lo diretamente. Isso dependeria inteiramente de quais plataformas e bibliotecas você possui.
Na pior das hipóteses, você pode usar a biblioteca boost :: asio para estabelecer uma conexão TCP, enviar os cabeçalhos HTTP (RFC 2616) e analisar as respostas diretamente. Olhando para as necessidades de sua aplicação, isso é simples o suficiente.
fonte
Aqui está um código que funcionará sem a necessidade de usar nenhuma biblioteca de terceiros: primeiro defina seu gateway, usuário, senha e quaisquer outros parâmetros que você precisa enviar para esse servidor específico.
Aqui está o próprio código:
Isso deve funcionar em um ambiente de API do Win32.
Aqui está um exemplo .
fonte
InternetConnect
retorna nulo quando o URL completo é fornecido, mas retorna um valor não nulo quando apenas o nome do domínio é fornecido. Então, quando / onde uso o URL completo para obter a página que quero baixar?Resposta atualizada para abril de 2020:
Recentemente, tive muito sucesso com o cpp-activationplib (como cliente e servidor). É maduro e seu RPS aproximado e de thread único é de cerca de 6k.
Em termos mais avançados , há uma estrutura realmente promissora, a cpv-framework , que pode chegar a cerca de 180k RPS em dois núcleos (e escalará bem com o número de núcleos porque é baseada na estrutura seastar , que fornece os DBs mais rápidos em o planeta, scylladb ).
No entanto, o cpv-framework ainda é relativamente imaturo; portanto, para a maioria dos usos, eu recomendo o cpp-activationplib.
Esta recomendação substitui a minha resposta anterior (há 8 anos).
fonte
C e C ++ não têm uma biblioteca padrão para HTTP ou mesmo para conexões de soquete. Ao longo dos anos, algumas bibliotecas portáteis foram desenvolvidas. O mais amplamente usado, como outros já disseram, é o libcurl .
Aqui está uma lista de alternativas para libcurl (provenientes do site da libcurl).
Além disso, para Linux, isso é um cliente HTTP simples. Você pode implementar seu próprio cliente HTTP GET simples, mas isso não funcionará se houver autenticação ou redirecionamento envolvido ou se você precisar trabalhar atrás de um proxy. Para esses casos, você precisa de uma biblioteca completa como a libcurl.
Para código fonte com libcurl, este é o mais próximo do que você deseja (o Libcurl tem muitos exemplos ). Veja a função principal. O conteúdo html será copiado para o buffer, após uma conexão bem-sucedida. Apenas substitua parseHtml por sua própria função.
fonte
Você pode usar a biblioteca embeddedRest . É uma biblioteca leve apenas de cabeçalho. Portanto, é fácil incluí-lo no seu projeto e não requer compilação, porque não há
.cpp
arquivos nele.Solicite um exemplo
readme.md
do repo:fonte
netdb.h
etc, então eu gostaria de algumas sim ajuda#ifdef _WIN32
e adicionar um código específico do Windows. Veja aqui - não há muita diferença entre soquetes unix e soquetes para janelas. Vejo duas diferenças principais: 1) chamarWSAStartup
primeiro e 2) usarclosesocket
, em vez declose
O protocolo HTTP é muito simples, portanto, é muito simples escrever um cliente HTTP. Aqui está um
https://github.com/pedro-vicente/lib_netsockets
Ele usa HTTP GET para recuperar um arquivo de um servidor da Web, servidor e arquivo são parâmetros de linha de comando. O arquivo remoto é salvo em uma cópia local.
Disclaimer: Eu sou o autor
EDIT: URL editado
fonte
Observe que isso não requer libcurl, Windows.h ou WinSock! Nenhuma compilação de bibliotecas, nenhuma configuração de projeto etc. Eu tenho esse código trabalhando no Visual Studio 2017 c ++ no Windows 10:
Eu acabei de descobrir como fazer isso, como queria um script de acesso à API simples, bibliotecas como a libcurl estavam me causando todos os tipos de problemas (mesmo quando eu segui as instruções ...), e o WinSock é de nível muito baixo e complicado demais. .
Não tenho muita certeza sobre todo o código de leitura do IStream (particularmente a condição while - sinta-se à vontade para corrigir / melhorar), mas, ei, funciona , sem complicações! (Faz sentido para mim que, desde que eu usei uma chamada de bloqueio (síncrona) , tudo bem, isso
bytesRead
sempre seria> 0U até que o fluxo ( ISequentialStream ?) Termine de ser lido, mas quem sabe.Consulte também: Referência de apelidos de URL e protocolo de conexão assíncrona
fonte
Aqui está um código C ++ 11 (relativamente) simples que usa libCURL para baixar o conteúdo de uma URL em
std::vector<char>
:http_download.hh
http_download.cc
fonte
Geralmente, eu recomendaria algo entre plataformas, como cURL, POCO ou Qt. No entanto, aqui está um exemplo do Windows!
fonte
Se você estiver procurando por uma biblioteca cliente HTTP em C ++ suportada em várias plataformas (Linux, Windows e Mac) para consumir serviços da Web Restful. Você pode ter as opções abaixo.
fonte
Embora um pouco atrasado. Você pode preferir https://github.com/Taymindis/backcurl .
Ele permite que você faça chamadas http no desenvolvimento de c ++ móvel. Apropriado para o desenvolvimento de jogos para dispositivos móveis
fonte
Você pode usar o ACE para fazer isso:
fonte