2017-12-08 6 views
1

Ich versuche ein Programm zu erstellen, das einen Börsenticker aufnehmen, eine Google-Suche ausführen und Daten ausgeben würde (aktueller Preis, hoch, niedrig, prozentuale Änderung usw.) . Ich versuche, Boost Asio zu verwenden und es gibt keine Daten vom Server zurück. Boost Asio verwenden, um Webseite zu erhalten

#include "stdafx.h" 
#include <iostream> 
#include <istream> 
#include <ostream> 
#include <string> 
#include <boost/asio.hpp> 

std::string getStockPage(std::string ticker) { 
    boost::asio::ip::tcp::iostream stream; 

    stream.connect("www.google.com", "http"); 
    std::cout << "connected\n"; 
    stream << "GET /search?q=" << ticker << " HTTP/1.1\r\n"; 
    stream << "Host: www.google.com\r\n"; 
    stream << "Cache-Control: no-cache\r\n"; 
    //stream << "Content-Type: application/x-www-form-urlencoded\r\n\r\n"; 
    stream << "Connection: close\r\n\r\n"; 
    std::cout << "sent\n"; 

    std::ostringstream os; 
    //os << stream.rdbuf(); 
    char buffer[100]; 
    os << stream.readsome(buffer, 100); 
    return std::string(buffer, 100); 
} 

int main() { 
    std::cout << getStockPage("$tsla"); 
    std::cout << "done\n"; 
    std::string temp; 
    std::getline(std::cin, temp); 
    return 0; 


} 

Ich habe versucht, nur die ersten 100 Zeichen zu lesen, um zu sehen, ob es Probleme wurde mit der Antwort ausgibt, aber es gibt nur Null-Zeichen. Ich möchte, dass es die gesamte Google-Seite "www.google.com/search?q=$tsla" ausgibt

Jede Hilfe würde sehr geschätzt werden!

+0

Ist Druck http://www.boost.org/doc/libs/1_65_1/doc/ html/boost_asio/example/cpp03/http/client/sync_client.cpp –

+0

Mögliches Duplikat von [Senden einer http GET-Anfrage mit boost :: asio, ähnlich wie cURL] (https://stackoverflow.com/questions/28728347/sending-http -get-request-using-boostasio-ähnlich-zu-curl) –

Antwort

1

std::istream::readsome darf immer nur 0 Bytes zurückgeben. Dann scheint es, als ob Sie NUL Bytes empfangen, weil Sie

tat
return std::string(buffer, 100); 

statt

return std::string(buffer, stream.gcount()); 

Wirklich, benutzen Sie einfach den anderen Ansatz

std::ostringstream os; 
os << stream.rdbuf(); 
return os.str(); 

Dies funktioniert für ich beim Testen. Hinweis könnten Sie einen Flush hinzufügen:

stream << "Connection: close\r\n\r\n" << std::flush; 

Das resultierende Programm

#include <boost/asio.hpp> 
#include <iostream> 
#include <string> 

std::string getStockPage(std::string const& ticker) { 
    boost::asio::ip::tcp::iostream stream; 

    stream.connect("www.google.com", "http"); 
    stream << "GET /search?q=" << ticker << " HTTP/1.1\r\n"; 
    stream << "Host: www.google.com\r\n"; 
    stream << "Cache-Control: no-cache\r\n"; 
    // stream << "Content-Type: application/x-www-form-urlencoded\r\n\r\n"; 
    stream << "Connection: close\r\n\r\n" << std::flush; 

    std::ostringstream os; 
    os << stream.rdbuf(); 
    return os.str(); 
} 

int main() { 
    std::cout << getStockPage("$tsla"); 
} 

HTTP/1.1 302 Found 
Location: http://www.google.nl/search?q=%24tsla&gws_rd=cr&dcr=0&ei=3EMqWrKxCILUwAKv9LqICg 
Cache-Control: private 
Content-Type: text/html; charset=UTF-8 
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info." 
Date: Fri, 08 Dec 2017 07:48:44 GMT 
Server: gws 
Content-Length: 288 
X-XSS-Protection: 1; mode=block 
X-Frame-Options: SAMEORIGIN 
Set-Cookie: NID=118=MsVZZpoZFEz4mQDqDuuWFRViB8v8yEQju7FPdOw8Rr7ViQ1cJtF6ZeN9u-dSRhGMT4x8F8yDilk9FqsoTkO8IsoQX-YvHXRcCoHcOLk0p4VOTn8AZoldKeh84Ryl0bM0; expires=Sat, 09-Jun-2018 07:48:44 GMT; path=/; domain=.google.com; HttpOnly 
Connection: close 

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>302 Moved</TITLE></HEAD><BODY> 
<H1>302 Moved</H1> 
The document has moved 
<A HREF="http://www.google.nl/search?q=%24tsla&amp;gws_rd=cr&amp;dcr=0&amp;ei=3EMqWrKxCILUwAKv9LqICg">here</A>. 
</BODY></HTML>