2016-04-02 9 views
0

Ich versuche Verbindung mit Github-Server über POCO Bibliothek aufzubauen, meinen Code:Wie api.github.com mit POCO-Bibliothek verbinden

Poco::Net::initializeSSL(); 

    Poco::Net::Context context(Poco::Net::Context::CLIENT_USE, "", "", "", Poco::Net::Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 

    URI uri("https://api.github.com/zen"); 
    std::string path(uri.getPathAndQuery()); 

    HTTPSClientSession client(uri.getHost(), uri.getPort(), &context); 

    HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 

    if (!client.connected()) 
    { 
     int a{ 0 };//<<==ALWAYS END UP HERE, MEANING THAT client isn't connected 
    } 

Weiß jemand, wie mit diesem Server zu verbinden, dh Welche Schritte sind dafür erforderlich?

Antwort

1

Es ist nicht, weil Sie nicht die Anfrage gesendet haben verbunden ist. Versuchen:

client.sendRequest(req); 

UPDATE: GitHub API requires the user agent header, sonst werden Sie 403. So zu bekommen, hier ist ein voll funktionsfähiges Beispiel (Zertifikat-Handler und root cert optional in diesem speziellen Fall, aber gut haben):

#include "Poco/StreamCopier.h" 
#include "Poco/URI.h" 
#include "Poco/Exception.h" 
#include "Poco/SharedPtr.h" 
#include "Poco/Net/SSLManager.h" 
#include "Poco/Net/KeyConsoleHandler.h" 
#include "Poco/Net/ConsoleCertificateHandler.h" 
#include "Poco/Net/HTTPSClientSession.h" 
#include "Poco/Net/HTTPRequest.h" 
#include "Poco/Net/HTTPResponse.h" 
#include <memory> 
#include <iostream> 

using namespace Poco; 
using namespace Poco::Net; 

class SSLInitializer { 
public: 
    SSLInitializer() { Poco::Net::initializeSSL(); } 

    ~SSLInitializer() { Poco::Net::uninitializeSSL(); } 
}; 

int main(int argc, char** argv) 
{ 
    SSLInitializer sslInitializer; 

    SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false); 
    Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "rootcert.pem", Context::VERIFY_STRICT, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
    SSLManager::instance().initializeClient(0, ptrCert, ptrContext); 

    try 
    { 
     URI uri("https://api.github.com/zen"); 
     HTTPSClientSession s(uri.getHost(), uri.getPort()); 
     HTTPRequest request(HTTPRequest::HTTP_GET, uri.getPath()); 
     request.set("user-agent", "Poco HTTPSClientSession"); 
     s.sendRequest(request); 
     HTTPResponse response; 
     std::istream& rs = s.receiveResponse(response); 
     StreamCopier::copyStream(rs, std::cout); 
     std::cout << std::endl; 
    } 
    catch (Exception& ex) 
    { 
     std::cout << ex.displayText() << std::endl; 
     return 1; 
    } 

    return 0; 
} 

Und hier ist die Ausführung davon

$ gitget
administrative Ablenkung vermeiden.

+0

Hallo Alex, wollte ich Ihnen sehr für Ihr Beispiel danken. Ich schätze die Zeit und die Arbeit, die du hineingesteckt hast. Mit freundlichen Grüßen –

+0

Kein Problem. Würde es Ihnen etwas ausmachen, die Antwort zu akzeptieren? – Alex

+0

Ja, natürlich leid, ich war so aufgeregt, dass es funktioniert, dass es völlig meine Aufmerksamkeit übersprungen. Nochmals vielen Dank und ein schönes Wochenende. –