HTTP forráskód olvasás String-be Boost-tal [C++]

HTTP forráskód olvasás String-be Boost-tal [C++]
2014-02-17T02:02:36+01:00
2014-02-17T11:55:02+01:00
2022-11-30T13:35:35+01:00
Relative
Sziasztok!

Még mindig azon dolgozom, hogy String változóba olvassak egy internetes file tartalmát. A korábbi cURL-es kód nem volt használható, ezért új megoldás után néztem.

Találtam is egy példa kódot úgynevezett Boost eljárással, ami nagyon úgy néz ki, hogy ez már használható lesz:

#include <iostream> #include <istream> #include <ostream> #include <string> #include <boost/asio.hpp> using boost::asio::ip::tcp; std::string page_markup; int main(int argc, char* argv[]){ try{ if (argc != 3){ std::cout << "Usage: sync_client <server> <path>\n"; std::cout << "Example:\n"; std::cout << " sync_client www.boost.org /LICENSE_1_0.txt\n"; return 1; } boost::asio::io_service io_service; // Get a list of endpoints corresponding to the server name. tcp::resolver resolver(io_service); tcp::resolver::query query(argv[1], "http"); tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); tcp::resolver::iterator end; // Try each endpoint until we successfully establish a connection. tcp::socket socket(io_service); boost::system::error_code error = boost::asio::error::host_not_found; while (error && endpoint_iterator != end){ socket.close(); socket.connect(*endpoint_iterator++, error); } if (error) throw boost::system::system_error(error); // Form the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. boost::asio::streambuf request; std::ostream request_stream(&request); request_stream << "GET " << argv[2] << " HTTP/1.0\r\n"; request_stream << "Host: " << argv[1] << "\r\n"; request_stream << "Accept: */*\r\n"; request_stream << "Connection: close\r\n\r\n"; // Send the request. boost::asio::write(socket, request); // Read the response status line. boost::asio::streambuf response; boost::asio::read_until(socket, response, "\r\n"); // Check that response is OK. std::istream response_stream(&response); std::string http_version; response_stream >> http_version; unsigned int status_code; response_stream >> status_code; std::string status_message; std::getline(response_stream, status_message); if (!response_stream || http_version.substr(0, 5) != "HTTP/"){ std::cout << "Invalid response\n"; return 1; } if (status_code != 200){ std::cout << "Response returned with status code " << status_code << "\n"; return 1; } // Read the response headers, which are terminated by a blank line. boost::asio::read_until(socket, response, "\r\n\r\n"); // Process the response headers. std::string header; while (std::getline(response_stream, header) && header != "\r") std::cout << header << "\n"; std::cout << "\n"; // Write whatever content we already have to output. if (response.size() > 0){ std::cout << &response; } // Read until EOF, writing data to output as we go. while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error)) std::cout << &response; if (error != boost::asio::error::eof) throw boost::system::system_error(error); } catch (std::exception& e){ std::cout << "Exception: " << e.what() << "\n"; } return 0; }
A kérdés ugyanaz, mint a cURL-es esetnél: Hogyan teszem ki az oldal tartalmát String változóba? Ott a page_markup változó, abba kellene belerakni.

Olyasmivel próbálkoztam, hogy a response változókat cserélgettem a page_markup változóra. Egyelőre nem jártam sikerrel.

Relative
Mutasd a teljes hozzászólást!
Mondjuk a tartalmat az std::cout helyett egy std::ostringstream-be írod ki!
Majd meghívod a .str() metódusát..
Mutasd a teljes hozzászólást!

  • Miért nem használható a cURL-es kód?
    Egyszerűbb abban egy HTTP GET-et küldeni..
    Mutasd a teljes hozzászólást!
  • Mondjuk a tartalmat az std::cout helyett egy std::ostringstream-be írod ki!
    Majd meghívod a .str() metódusát..
    Mutasd a teljes hozzászólást!
  • Köszönöm. Ki fogom próbálni.

    "Miért nem használható a cURL-es kód?"

    Metatrader programhoz (Build 600+) készítek DLL funkciót, ami egyszerűen nem szereti a cURLT-t. Ha csak lefut egyetlen ártatlan kis cURL parancs, a Metatrader máris leáll hibaüzenettel. Az okát nem tudom.
    Mutasd a teljes hozzászólást!
  • Más DLL-t már készítettél hozzá? Biztos, hogy a cURL hívástól száll el és nem valami más sántít a dologban?
    Mutasd a teljes hozzászólást!
  • Igen. A napokban számos DLL funkciót készítettem hozzá, ami működik.

    A cURL-es kódnál gyakorlatilag kisakkoztam, hogy meddig a pontig működik a DLL meghívása és honnan tér vissza hibaüzenettel a Metatrader. Érdekes volt, hogy ha csak szerepelt valahol a DLL kódban a curl = curl_easy_init(); sor, akkor már jelezte is a hibát. Akkor is, ha DLL-en belül meg sem volt hívva az a funkció vagy programrész, ahol ez a curl_easy_init() utasítás volt.

    A Boost-os függvénnyel viszont nincs gond. Ott szépen működik a DLL. Csak még az eredményét nem tudtam kitenni változóba.
    (Még nem próbáltam az általad ajánlott dolgot. De nem sokára megteszem.)
    Mutasd a teljes hozzászólást!
  • Javaslatodra azt csináltam, hogy először lecseréltem a std::string page_markup; sort erre:

    std::ostringstream page_markup;
    Majd a // Write whatever content we already have to output. résznél az std::cout << &response; sor írtam át így:

    // Write whatever content we already have to output. if (response.size() > 0){ std::cout << &page_markup; }
    Végül így hoztam vissza String-be a page_markup tartalmát:

    std::string string_page_markup = page_markup.str();

    Eredmény: nem kapok vissza eredményül semmit. Vagyis üres a string_page_markup változó.

    Az a baj, hogy nem tudom, hogy pontosan hol adja vissza a tartalmat. Mert van itt minden (header, response_stream, status_message).
    Mutasd a teljes hozzászólást!
  • // Write whatever content we already have to output. if (response.size() > 0){ std::cout << &page_markup; }


    Szerinted itt mit csinal ez a sor?

    std::cout << &page_markup;

    Kiirod a standard outputra a page_markup valtozo cimet.

    Igy kellett volna atirnod:

    page_markup << &response;
    Mutasd a teljes hozzászólást!
  • :) Tényleg!

    És láss csodát: Működik! :))

    ...Na látod, ennyire kezdő vagyok még C++-ban. Komolyan nem tudtam, hogy ez a '<<' jeles művelet hogyan működik.

    Köszönöm szépen a segítséget mindkettőtöknek!

    (Galovics, ha nem bánod, **G** hozzászólását jelölöm meg megoldásként.)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd