2016-04-02 1 views
0

Я пытаюсь установить соединение с сервером через GitHub библиотеки POCO, мой код:Как подключиться к api.github.com с использованием POCO библиотеки

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 
    } 

Кто-нибудь знает, как подключиться к этому серверу, т.е. какие шаги необходимы для достижения этого?

ответ

1

Это не связано, потому что вы не отправили запрос. Попробуйте:

client.sendRequest(req); 

UPDATE: GitHub API requires the user agent header, в противном случае вы получите 403. Так вот полнофункциональный пример (обработчик сертификатов и корневой сертификат необязательными в данном конкретном случае, но хорошо иметь):

#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; 
} 

А вот его исполнение:

$ gitget
Избегайте административного отвлечение.

+0

привет, Алекс, я хотел поблагодарить вас за ваш пример. Внимательно оцените время и работу, которые вы вложили в нее. С наилучшими пожеланиями –

+0

Нет проблем. Не могли бы вы принять ответ? – Alex

+0

Да, конечно, извините за это, я был так взволнован, что он работает, что он полностью лишил моего внимания. Еще раз спасибо большое и хорошо провести выходные. –

Смежные вопросы