【问题标题】:How to connect to api.github.com using POCO library如何使用 POCO 库连接到 api.github.com
【发布时间】:2016-04-02 14:20:02
【问题描述】:

我正在尝试通过 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
    }  

有谁知道如何连接到该服务器,即需要哪些步骤才能实现?

【问题讨论】:

    标签: poco-libraries


    【解决方案1】:

    未连接,因为您没有发送请求。试试:

    client.sendRequest(req);
    

    更新: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
    避免行政分心。

    【讨论】:

    • 嗨,Alex,我非常感谢您的示例。非常感谢您投入的时间和工作。最好的问候
    • 是的,当然,很抱歉,我太兴奋了,以至于它完全忽略了我的注意力。再次感谢您,祝您周末愉快。
    • @Alex:非常丰富的答案,+1。我在 poco 有一个类似的问题,stackoverflow.com/questions/36771435/…。你能看到吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多