#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 responseintmain(int argc,char** argv){
try
{autoconst host ="www.baidu.com";//要訪問的主機名autoconst port ="80";//http服務端口autoconst target ="/loading.html";//要獲取的文檔int version =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 nameautoconst 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;}
異步方式
//// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)//// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//// Official repository: https://github.com/boostorg/beast////------------------------------------------------------------------------------//// Example: HTTP client, asynchronous////------------------------------------------------------------------------------#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<functional>#include<iostream>#include<memory>#include<string>
using tcp = boost::asio::ip::tcp;// from <boost/asio/ip/tcp.hpp>
namespace http = boost::beast::http;// from <boost/beast/http.hpp>//------------------------------------------------------------------------------// Report a failurevoidfail(boost::system::error_code ec,charconst* what){
std::cerr << what <<": "<< ec.message()<<"\n";}// Performs an HTTP GET and prints the response
class session : public std::enable_shared_from_this<session>{
tcp::resolver resolver_;
tcp::socket socket_;
boost::beast::flat_buffer buffer_;// (Must persist between reads)
http::request<http::empty_body> req_;
http::response<http::string_body> res_;
public:// Resolver and socket require an io_context
explicit
session(boost::asio::io_context& ioc):resolver_(ioc),socket_(ioc){}// Start the asynchronous operationvoidrun(charconst* host,charconst* port,charconst* target,int version){// Set up an HTTP GET request message
req_.version(version);
req_.method(http::verb::get);
req_.target(target);
req_.set(http::field::host, host);
req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);// Look up the domain name
resolver_.async_resolve(
host,
port,
std::bind(&session::on_resolve,shared_from_this(),
std::placeholders::_1,
std::placeholders::_2));}voidon_resolve(
boost::system::error_code ec,
tcp::resolver::results_type results){if(ec)returnfail(ec,"resolve");// Make the connection on the IP address we get from a lookup
boost::asio::async_connect(
socket_,
results.begin(),
results.end(),
std::bind(&session::on_connect,shared_from_this(),
std::placeholders::_1));}voidon_connect(boost::system::error_code ec){if(ec)returnfail(ec,"connect");// Send the HTTP request to the remote host
http::async_write(socket_, req_,
std::bind(&session::on_write,shared_from_this(),
std::placeholders::_1,
std::placeholders::_2));}voidon_write(
boost::system::error_code ec,
std::size_t bytes_transferred){
boost::ignore_unused(bytes_transferred);if(ec)returnfail(ec,"write");// Receive the HTTP response
http::async_read(socket_, buffer_, res_,
std::bind(&session::on_read,shared_from_this(),
std::placeholders::_1,
std::placeholders::_2));}voidon_read(
boost::system::error_code ec,
std::size_t bytes_transferred){
boost::ignore_unused(bytes_transferred);if(ec)returnfail(ec,"read");// Write the message to standard out
std::cout << res_ << std::endl;// Gracefully close the socket
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)returnfail(ec,"shutdown");// If we get here then the connection is closed gracefully}};//------------------------------------------------------------------------------intmain(int argc,char** argv){#if 0// Check command line arguments.if(argc !=4&& argc !=5){
std::cerr <<"Usage: http-client-async <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n"<<"Example:\n"<<" http-client-async www.example.com 80 /\n"<<" http-client-async www.example.com 80 / 1.0\n";return EXIT_FAILURE;}#endifautoconst host ="www.baidu.com";//要訪問的主機名autoconst port ="80";//http服務端口autoconst target ="/loading.html";//要獲取的文檔int version =11;// The io_context is required for all I/O
boost::asio::io_context ioc;// Launch the asynchronous operation
std::make_shared<session>(ioc)->run(host, port, target, version);// Run the I/O service. The call will return when// the get operation is complete.
ioc.run();return EXIT_SUCCESS;}
協程方式
//// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)//// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//// Official repository: https://github.com/boostorg/beast////------------------------------------------------------------------------------//// Example: HTTP client, coroutine////------------------------------------------------------------------------------#include<boost/beast/core.hpp>#include<boost/beast/http.hpp>#include<boost/beast/version.hpp>#include<boost/asio/connect.hpp>#include<boost/asio/spawn.hpp>#include<boost/asio/ip/tcp.hpp>#include<cstdlib>#include<functional>#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>//------------------------------------------------------------------------------// Report a failurevoidfail(boost::system::error_code ec,charconst* what){
std::cerr << what <<": "<< ec.message()<<"\n";}// Performs an HTTP GET and prints the responsevoiddo_session(
std::string const& host,
std::string const& port,
std::string const& target,int version,
boost::asio::io_context& ioc,
boost::asio::yield_context yield){
boost::system::error_code ec;// These objects perform our I/O
tcp::resolver resolver{ ioc };
tcp::socket socket{ ioc };// Look up the domain nameautoconst results = resolver.async_resolve(host, port, yield[ec]);if(ec)returnfail(ec,"resolve");// Make the connection on the IP address we get from a lookup
boost::asio::async_connect(socket, results.begin(), results.end(), yield[ec]);if(ec)returnfail(ec,"connect");// 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::async_write(socket, req, yield[ec]);if(ec)returnfail(ec,"write");// This buffer is used for reading and must be persisted
boost::beast::flat_buffer b;// Declare a container to hold the response
http::response<http::dynamic_body> res;// Receive the HTTP response
http::async_read(socket, b, res, yield[ec]);if(ec)returnfail(ec,"read");// Write the message to standard out
std::cout << res << std::endl;// Gracefully close the socket
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)returnfail(ec,"shutdown");// If we get here then the connection is closed gracefully}//------------------------------------------------------------------------------intmain(int argc,char** argv){#if 0// Check command line arguments.if(argc !=4&& argc !=5){
std::cerr <<"Usage: http-client-async <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n"<<"Example:\n"<<" http-client-async www.example.com 80 /\n"<<" http-client-async www.example.com 80 / 1.0\n";return EXIT_FAILURE;}#endifautoconst host ="www.baidu.com";//要訪問的主機名autoconst port ="80";//http服務端口autoconst target ="/loading.html";//要獲取的文檔int version =11;// The io_context is required for all I/O
boost::asio::io_context ioc;// Launch the asynchronous operation
boost::asio::spawn(ioc, std::bind(&do_session,
std::string(host),
std::string(port),
std::string(target),
version,
std::ref(ioc),
std::placeholders::_1));// Run the I/O service. The call will return when// the get operation is complete.
ioc.run();return EXIT_SUCCESS;}