0

我正在尝试构建一个 C++ 应用程序来访问 XML 资源。使用 http 代码可以正常工作,从我从文档中可以看出,我需要做的就是确保 ssl 已安装(是的,已安装开发版),并将 StreamFactory 更改为 HTTPSStreamFactory。

这是有效的代码:

Poco::Net::HTTPStreamFactory::registerFactory();
Poco::URI uri(argv[1]);

std::auto_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(uri));
std::string str;      
StreamCopier::copyToString(*pStr.get(), str);

这是失败的代码 Poco::Net::HTTPSStreamFactory::registerFactory(); Poco::URI uri(argv[1]);

std::auto_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(uri));
std::string str;      
StreamCopier::copyToString(*pStr.get(), str);

当我使用 HTTPSStreamFactory 发出请求时,这是我收到的错误消息:

空指针:_pInstance [在文件“/home/chpick/poco-1.3.6p2/Util/include/Poco/Util/Application.h”中,第 422 行]

我已附上 Application.h

inline Application& Application::instance()
{
    poco_check_ptr (_pInstance);
    return *_pInstance;
}

任何帮助都会很棒。谢谢

4

2 回答 2

1

检查文档以获取与检查证书类似的内容。您会看到,SSL 通过服务器和客户端交换证书来工作,并且在我使用过的每个执行 SSL 的库中,开发人员必须创建一个函数或以其他方式验证服务器发送的证书;这通常意味着开发人员只是接受任何东西而不检查,因为大多数人并不真正关心这一点。您的程序可能存在段错误,因为正在调用该代码,并且没有返回任何内容,因此正在取消引用 null 或类似的东西。

于 2010-07-15T21:45:02.407 回答
1

我最终以不同的方式去做:这就是我所做的。

    const Poco::URI uri(xmlParams.restURI);
    std::string path(argv[1]);
    const Poco::Net::Context::Ptr context = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
    Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort(), context );
    Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, argv[1] );
    req.setKeepAlive(false);

  std::string strToSend = "/";
    session.sendRequest(req) << strToSend;
    Poco::Net::HTTPResponse res;
    std::istream& rs = session.receiveResponse(res);    // typedef std::istream XMLCharInputStream;

    std::string str;    
    StreamCopier::copyToString(rs, str);

    std::istringstream istr(str);
    InputSource source(istr);
    parser.parse(&source);
于 2010-07-19T20:36:11.043 回答