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)
cevap
Geçen gün birisi another thread bu önerilen:
(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).Sadece HTTPS'nin henüz desteklenmediğini öğrenmek için bu kadar zaman harcadım. Bu henüz olgunlaşmamış, eğer olacaksa. – Homer6
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
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
Ayrıca Pion Ağ Kitaplığı kontrol etmelisiniz:
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
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
asio yazar uygulamak:
Boost.Http - Yeni burada oyuncu: https://github.com/BoostGSoC14/boost.http, docs - http://boostgsoc14.github.io/boost.http/
Ancak, şimdi, bu sadece sunucu tarafı. – Xoph
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;
}
Yazar olduğumu açıklayan bir not ekledim. –
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
için "Boostify" libcurl çalışırken bu proje var: Burada
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.
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
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
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