2010-02-12 8 views
57

Modern bir C++ HTTP kitaplığı arıyorum çünkü libcurl'ın eksikliklerinin C++ paketleyicileri tarafından çalışılması zordur. De-facto C++ TCP kütüphanesi haline gelen Boost.ASIO'ya dayanan çözümler tercih ediliyor.Boost.ASIO tabanlı bir HTTP istemci kitaplığı (libcurl gibi)

+5

Merhaba. sadece ne kullanarak bittiğini merak ediyor musun? Benzer bir senaryo var (C++ http istemcisi gerekli). Aşağıda önerilen C++ ağ kitaplığı veya başka bir kitaplık kullanarak mı oldunuz? Teşekkürler. – skimobear

+0

Evet, cpp-netlib kullandım. Oldukça minimalist (ya da * çok * minimalist belgelerin eksik özellikleri var) ve bunun için HTTP temel auth (el ile giriş/şifre belirtmek yerine uygun başlık ekleyerek) gibi şeyler yapmanız gerekir. Gelişmeye devam ederse çok iyi olacak ve şu anda kesinlikle kullanılabilir (ve sadece başlık büyük bir artıdır). – Tronic

+3

Kayıt için, kısa bir süre önce cpp-netlib ile bir problem yaşadım çünkü derleme yapmak çok uzun zaman alıyor ve en basit şeyler için bile (GCC ile) 1 GB'den fazla RAM'e ihtiyacınız olacak. Bu yüzden, en azından alma/gönderme işlevlerinizi hiçbir zaman değiştirmeye veya yeniden derlemenize gerek olmayan ayrı bir kaynak modülüne ayırın ve bu kitaplığın uygulanmasının dışında herhangi bir yerde bulunmayın. – Tronic

cevap

28

Geçen gün birisi another thread bu önerilen:

http://cpp-netlib.github.com/

(söyleyebilirim ben bu bulacaksınız gibi yüksek seviyeli olduğunu düşünüyorum ama henüz yeterince olgun olup olmadığından emin değilim Muhtemelen Boost katılımı için teklif ettikleri için budur).

+5

Sadece HTTPS'nin henüz desteklenmediğini öğrenmek için bu kadar zaman harcadım. Bu henüz olgunlaşmamış, eğer olacaksa. – Homer6

+1

Maalesef çalışsaydı harika olurdu. Çok fazla işlevsellik eksiktir ve en son kullandığım zaman, yığınsal yanıtlar üzerinde boğuldu. Bu kütüphane için kullanıcı arayüzlerinin tasarımı çok basit ve oldukça tercih edilen olduğundan çok üzdü. – Bob9630

+0

Bu kütüphane, sadece HTTP sunucularından dosya almak veya kendi basit HTTP sunucunuzu/istemcinizi oluşturmak için kullanışlıdır. Ama bu tam ihtiyacım olan şey! Libcurl çoğu zaman fazladır. – vitakot

5

Ayrıca Pion Ağ Kitaplığı kontrol etmelisiniz:

http://pion.org/projects/pion-network-library

+0

Sonunda buna uygun bir şekilde baktım ama sadece sunucu olarak görünüyor (belgelerden tamamen anlaşılmasa da). Çok az sayıda doküman ama en azından kod aktif olarak korunmuş gibi görünüyor. – Tronic

+0

8 ay boyunca Pion kütüphanesini kullanıyorsunuz. Öncelikle Sunucu bileşenlerini kullanın, fakat aynı zamanda bir istemci kullandı. Her ikisi de çok iyi çalışıyor. Şimdiye kadar karşılaşılan tek sorun, HttpResponse sınıfının maksimum içerik boyutu (1 MB). Daha yüksek bir limit belirlemek için HttpResponse'den türetmek zorundaydık. Sunucu kaya sağlam. – Scottymac

8
+0

Şimdi, 2012'de bu proje, 2009'dan beri güncellenemediğim sayfalar kadar ölü görünüyor. Ayrıca async arayüzü çok düşük seviyede (asio gibi) ve bu nedenle çok kullanıcı dostu değil. Çok az işlevsellik, çok az dokümantasyon. – Tronic

+0

Evet, ama gerçekten işe yaradı. – Ken

13

Daha geç olmadan, eski bir sorunun yeni bir cevabı. Boost.Asio kullanarak hem HTTP hem de WebSocket işlevselliği sunan Boost.Beast adlı yeni bir açık kaynak kütüphanesi var. Tanıdık Asio arayüzlerini olabildiğince yakından öykünür ve çok sayıda dokümantasyona sahiptir. Seçiminizi, bjam veya CMake kullanarak clang, gcc ve Visual Studio'da geliştirir! Not, ben de kütüphanenin yazarıyım. https://github.com/breese/trial.url

Ben bir referans olarak kullanacağız:

#include <boost/beast/core.hpp> 
#include <boost/beast/http.hpp> 
#include <boost/beast/version.hpp> 
#include <boost/asio/connect.hpp> 
#include <boost/asio/ip/tcp.hpp> 
#include <cstdlib> 
#include <iostream> 
#include <string> 

using tcp = boost::asio::ip::tcp;  // from <boost/asio/ip/tcp.hpp> 
namespace http = boost::beast::http; // from <boost/beast/http.hpp> 

// Performs an HTTP GET and prints the response 
int main(int argc, char** argv) 
{ 
    try 
    { 
     // Check command line arguments. 
     if(argc != 4 && argc != 5) 
     { 
      std::cerr << 
       "Usage: http-client-sync <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" << 
       "Example:\n" << 
       " http-client-sync www.example.com 80 /\n" << 
       " http-client-sync www.example.com 80/1.0\n"; 
      return EXIT_FAILURE; 
     } 
     auto const host = argv[1]; 
     auto const port = argv[2]; 
     auto const target = argv[3]; 
     int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11; 

     // The io_context is required for all I/O 
     boost::asio::io_context ioc; 

     // These objects perform our I/O 
     tcp::resolver resolver{ioc}; 
     tcp::socket socket{ioc}; 

     // Look up the domain name 
     auto const results = resolver.resolve(host, port); 

     // Make the connection on the IP address we get from a lookup 
     boost::asio::connect(socket, results.begin(), results.end()); 

     // Set up an HTTP GET request message 
     http::request<http::string_body> req{http::verb::get, target, version}; 
     req.set(http::field::host, host); 
     req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING); 

     // Send the HTTP request to the remote host 
     http::write(socket, req); 

     // This buffer is used for reading and must be persisted 
     boost::beast::flat_buffer buffer; 

     // Declare a container to hold the response 
     http::response<http::dynamic_body> res; 

     // Receive the HTTP response 
     http::read(socket, buffer, res); 

     // Write the message to standard out 
     std::cout << res << std::endl; 

     // Gracefully close the socket 
     boost::system::error_code ec; 
     socket.shutdown(tcp::socket::shutdown_both, ec); 

     // not_connected happens sometimes 
     // so don't bother reporting it. 
     // 
     if(ec && ec != boost::system::errc::not_connected) 
      throw boost::system::system_error{ec}; 

     // If we get here then the connection is closed gracefully 
    } 
    catch(std::exception const& e) 
    { 
     std::cerr << "Error: " << e.what() << std::endl; 
     return EXIT_FAILURE; 
    } 
    return EXIT_SUCCESS; 
} 
+0

Yazar olduğumu açıklayan bir not ekledim. –

+1

Beast'in, hala yazım aşamasında beta olmasına rağmen, Boost'a dahil edilmek için kabul edildiğini hatırlamak için belki de güncellenmeye değer? Krş http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast.html Yazar için tebrikler! – Tommy

0

için "Boostify" libcurl çalışırken bu proje var: Burada

https://github.com/boostorg/beast/

bir web sayfasını alır tam bir örnek program Boost.Http istemci API'sini tasarlamak. Bununla birlikte, yüksek düzeyli soyutlamalara odaklanmayı ve Beast.HTTP yazarı ile mümkün olduğunca fazla işbirliği yapmayı planlıyorum.