如何使用POCO库连接到api.github.com

时间:2016-04-02 14:20:03

标签: poco-libraries

我试图通过POCO库与github服务器建立连接,我的代码:

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 个答案:

答案 0 :(得分:1)

It is not connected because you did not send the request. Try:

client.sendRequest(req);

UPDATE: GitHub API requires the user agent header, otherwise you'll get 403. So, here's a fully functional example (certificate handler and root cert optional in this particular case, but good to have):

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

And here is the execution thereof:

$ gitget
Avoid administrative distraction.