Size: a a a

2020 May 17

A

ARCHANGEL in pro.cxx
Коллеги, использую сейчас boost beast, и хочу сделать простой get запрос. Вот у меня есть url к какой-то странице, есть ли пример, как это сделать? То, что находил, требует задать хост, порт, но в общем случае я хочу на вход подавать только url, что я делаю или понимаю не так?
источник

AZ

Alexander Zaitsev in pro.cxx
ARCHANGEL
Коллеги, использую сейчас boost beast, и хочу сделать простой get запрос. Вот у меня есть url к какой-то странице, есть ли пример, как это сделать? То, что находил, требует задать хост, порт, но в общем случае я хочу на вход подавать только url, что я делаю или понимаю не так?
надо брать более высокоуровневую библиотеку просто
источник

A

ARCHANGEL in pro.cxx
Alexander Zaitsev
надо брать более высокоуровневую библиотеку просто
что есть такое в бусте?
источник

AZ

Alexander Zaitsev in pro.cxx
ARCHANGEL
что есть такое в бусте?
ничего
источник

AZ

Alexander Zaitsev in pro.cxx
одним бустом мир не ограничен
источник

A

ARCHANGEL in pro.cxx
Alexander Zaitsev
ничего
т.е. я должен с урла вычислить хост и порт?
источник

AD

Andrey Davydov in pro.cxx
Antony Polukhin
Хмммм
А ведь можно было сделать макросы чувствительными к namespace
Есть диалект HLSL поддерживающий подобное (https://github.com/historia-Inc/Tech_UDPDemo/blob/master/Binaries/UE4/Engine/Shaders/StandaloneRenderer/D3D/SlateElementPixelShader.hlsl#L6). Все плохие идеи уже были кем-то когда-то придуманы.
источник

v

vehlwn in pro.cxx
ARCHANGEL
Коллеги, использую сейчас boost beast, и хочу сделать простой get запрос. Вот у меня есть url к какой-то странице, есть ли пример, как это сделать? То, что находил, требует задать хост, порт, но в общем случае я хочу на вход подавать только url, что я делаю или понимаю не так?
Если нужен только клиент, то либкурл https://curl.haxx.se/libcurl/c/https.html
источник

A

ARCHANGEL in pro.cxx
vehlwn
Если нужен только клиент, то либкурл https://curl.haxx.se/libcurl/c/https.html
либкурл у меня работает, спасибо, мне надо через буст
источник

v

vehlwn in pro.cxx
ARCHANGEL
либкурл у меня работает, спасибо, мне надо через буст
Решил повысить сложность?
источник

A

ARCHANGEL in pro.cxx
vehlwn
Решил повысить сложность?
типа, обосновать, что мы в проекте возьмём буст, и откажемся от 100500 мелких узкоспециализированных либ
источник
2020 May 18

AP

Antony Polukhin in pro.cxx
Andrey Davydov
Есть диалект HLSL поддерживающий подобное (https://github.com/historia-Inc/Tech_UDPDemo/blob/master/Binaries/UE4/Engine/Shaders/StandaloneRenderer/D3D/SlateElementPixelShader.hlsl#L6). Все плохие идеи уже были кем-то когда-то придуманы.
Выглядит как enum без type safety
источник

AM

Alexander Malkov in pro.cxx
ARCHANGEL
Коллеги, использую сейчас boost beast, и хочу сделать простой get запрос. Вот у меня есть url к какой-то странице, есть ли пример, как это сделать? То, что находил, требует задать хост, порт, но в общем случае я хочу на вход подавать только url, что я делаю или понимаю не так?
просто сделать свою функцию, которая разделит url на три (или четыре) состовляющие, название протокола (http/https) DNS имя (example.com) порт (при наличии 80/443) и адрес страницы (/path/to/data)
дальше, нужно резолвить IP из DNS адреса
типо такого:
std::string host = "example.com";
unsigned int port_num = 80;
asio::ip::tcp::resolver::query resolver_query(host,
 port_num, asio::ip::tcp::resolver::query::numeric_service);
asio::ip::tcp::resolver resolver(ios);
boost::system::error_code ec;
asio::ip::tcp::resolver::iterator it =
 resolver.resolve(resolver_query, ec);


и уже дальше у нас есть все данные, чтобы получить GET запрос в boost.beast

Вот, ничего сложного в этом нет) Удачи)
источник

A

ARCHANGEL in pro.cxx
Alexander Malkov
просто сделать свою функцию, которая разделит url на три (или четыре) состовляющие, название протокола (http/https) DNS имя (example.com) порт (при наличии 80/443) и адрес страницы (/path/to/data)
дальше, нужно резолвить IP из DNS адреса
типо такого:
std::string host = "example.com";
unsigned int port_num = 80;
asio::ip::tcp::resolver::query resolver_query(host,
 port_num, asio::ip::tcp::resolver::query::numeric_service);
asio::ip::tcp::resolver resolver(ios);
boost::system::error_code ec;
asio::ip::tcp::resolver::iterator it =
 resolver.resolve(resolver_query, ec);


и уже дальше у нас есть все данные, чтобы получить GET запрос в boost.beast

Вот, ничего сложного в этом нет) Удачи)
ща попробую, спасибо
источник

AS

Anatoly Shirokov in pro.cxx
Anatoly Shirokov
мне надо было как-то на части разложить url, но я ничего такого не нашел, поэтому написал regexp. для моей задачи подошел, можешь взять за основу:
URL URL::Parse(const char * url) {
std::regex r("^"
   "("             // 1. server = protocol user:password @ host : port
   "("             // 2. protocol = scheme + ://
   "([^:]+)"       // 3. scheme
   "://"           //
   ")"
   "("             // 4. user:password
   "([^:@]+)?"     // 5. user
   "(:([^@]*))?"   // 6. :password 7. password
   "@)?"
   "([^:/$]+)?"    // 8. host
   "(:(\\d+))?"    // 9. :port 10. port
   ")"
   "(/[^$]*)?"     // 11. path
   "$"
 );
 std::cmatch m;
 bool matched = std::regex_match(url, m, r);
источник

AM

Alexander Malkov in pro.cxx
ну или можно банально взять string_view и  разделить по частям)
источник

AS

Anatoly Shirokov in pro.cxx
Alexander Malkov
ну или можно банально взять string_view и  разделить по частям)
а чем это будет отличаться от разделения на части regex-ом?
источник

AM

Alexander Malkov in pro.cxx
Anatoly Shirokov
а чем это будет отличаться от разделения на части regex-ом?
regex поинтереснее)
источник

A

ARCHANGEL in pro.cxx
std::string Requests::Get(const std::string& url)
{
 boost::asio::io_context ioContext;
 boost::asio::ip::tcp::resolver resolver(ioContext);
 boost::asio::ip::tcp::resolver::query query(url, "80",
                                               boost::asio::ip::tcp::resolver::query::numeric_service);
 const auto resolved = resolver.resolve(query);
 boost::beast::tcp_stream tcpStream(ioContext);
 tcpStream.connect(resolved);

 boost::beast::http::request<boost::beast::http::string_body> request{ boost::beast::http::verb::get,
     url, 11 };
 request.set(boost::beast::http::field::host, url);
 request.set(boost::beast::http::field::user_agent, "Agent");
 boost::beast::http::write(tcpStream, request);
 boost::beast::flat_buffer buffer;
 boost::beast::http::response<boost::beast::http::dynamic_body> response;

 boost::beast::http::read(tcpStream, buffer, response);
 const std::string answer = boost::beast::buffers_to_string(buffer.data());

 tcpStream.socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both);
 return answer;
}


Получаю bad request
источник

AM

Alexander Malkov in pro.cxx
ARCHANGEL
std::string Requests::Get(const std::string& url)
{
 boost::asio::io_context ioContext;
 boost::asio::ip::tcp::resolver resolver(ioContext);
 boost::asio::ip::tcp::resolver::query query(url, "80",
                                               boost::asio::ip::tcp::resolver::query::numeric_service);
 const auto resolved = resolver.resolve(query);
 boost::beast::tcp_stream tcpStream(ioContext);
 tcpStream.connect(resolved);

 boost::beast::http::request<boost::beast::http::string_body> request{ boost::beast::http::verb::get,
     url, 11 };
 request.set(boost::beast::http::field::host, url);
 request.set(boost::beast::http::field::user_agent, "Agent");
 boost::beast::http::write(tcpStream, request);
 boost::beast::flat_buffer buffer;
 boost::beast::http::response<boost::beast::http::dynamic_body> response;

 boost::beast::http::read(tcpStream, buffer, response);
 const std::string answer = boost::beast::buffers_to_string(buffer.data());

 tcpStream.socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both);
 return answer;
}


Получаю bad request
а в url - только что-то типо example.com?
источник