【问题标题】:How do I make an HTTP Post with HTTP Basic Authentication, using POCO?如何使用 POCO 使用 HTTP 基本身份验证进行 HTTP 发布?
【发布时间】:2012-10-21 09:06:21
【问题描述】:

我正在尝试使用 POCO 使用 HTTP 基本身份验证(明文用户名和密码)进行 HTTP 发布。我找到了一个 Get 示例并尝试对其进行修改,但作为一个菜鸟,我认为我已经把它弄坏了,没有用处。有人知道怎么做吗?

是的,我已经看到了关于此的另一个 SO 问题:POCO C++ - NET SSL - how to POST HTTPS request,但我无法理解它是如何尝试实现用户名和密码部分的。我也不明白“x-www-form-urlencoded”的用法。这是帖子所必需的吗?我没有表格。只想用用户名和密码参数POST到服务器。

【问题讨论】:

    标签: c++ http post basic-authentication poco-libraries


    【解决方案1】:

    最后。以下是你的做法:

    HTTPClientSession session("yourdomain.com");
    session.setKeepAlive(true);
    
    Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, "/myapi.php/api/validate", HTTPMessage::HTTP_1_1);
    req.setContentType("application/x-www-form-urlencoded");
    req.setKeepAlive(true); // notice setKeepAlive is also called on session (above)
    
    std::string reqBody("username=user1@yourdomain.com&password=mypword");
    req.setContentLength( reqBody.length() );
    
    std::ostream& myOStream = session.sendRequest(req); // sends request, returns open stream
    myOStream << reqBody;  // sends the body
    
    req.write(std::cout);
    
    Poco::Net::HTTPResponse res;
    std::istream& iStr = session.receiveResponse(res);  // get the response from server
    std::cerr << iStr.rdbuf();  // dump server response so you can view it
    

    【讨论】:

    • 在代码中,您对在会话和请求上都使用setKeepAlive() 有明确的评论。您能否编辑您的答案以解释两者的目的,以及留下一个或任何一个的影响是什么?
    • 你有什么理由不使用HTTPBasicCredentials
    • 不,我没有故意不使用 HTTPBasicCredentials。那时候很多事情我都不知道。有点投入 iOS 并有其他项目。稍后必须回答您的第一个问题。
    • +1 因为你帮我回答了这个问题:stackoverflow.com/questions/44333630/… 如果你还在附近,也许你可以帮助我使用 Poco Net 获取授权码。
    • 我看到你最终也回答了你自己的问题 :)
    【解决方案2】:

    当您执行 HTTP POST 时,发送到服务器的数据通常以两种形式之一发送:

    • 名称、值对,其中名称和值用“=”分隔,不同的对用“&”分隔。例如:var1=value1&amp;var2=value2。此外,发送这些名称值对,以便将某些特殊字符和非字母数字字符替换为 %HH、一个百分号和两个表示字符 ASCII 代码的十六进制数字。例如,如果第一个参数的值包含“#”,它将作为var1=value1%23&amp;var2=value2 发送。以这种格式发送数据时,客户端需要插入一个值为application/x-www-form-urlencoded的Content-Type头,这样服务器才能正确解码数据。

    • 作为多部分 MIME 主体,其中每个部分的大小都可以很大,并且包括“非转义”数据(包括二进制数据)。不同的 MIME 部分由不出现在任何 MIME“有效负载”中的字符串分隔符(边界)分隔。以这种格式发送数据时,客户端需要插入一个值为multipart/form-data的Content-Type头。

    在您引用的上一个 StackOverflow 问题的情况下,请求正文以第一种方式发送,如上所示。希望澄清。

    问候, 悉达多

    【讨论】:

    • 悉达多,这确实有点澄清。谢谢。你用过POCO吗?如果您可以提供可以使用 POCO 库使用 uname 和 pword 成功发布的代码,我会将您的答案标记为正确。
    【解决方案3】:

    来自 POCO 库凭证测试,代码如下:

    HTTPRequest request;
    assert (!request.hasCredentials());
    
    HTTPBasicCredentials cred("user", "secret");
    cred.authenticate(request);
    assert (request.hasCredentials());
    std::string scheme;
    std::string info;
    request.getCredentials(scheme, info);
    assert (scheme == "Basic");
    assert (info == "dXNlcjpzZWNyZXQ=");
    
    HTTPBasicCredentials cred2(request);
    assert (cred2.getUsername() == "user");
    assert (cred2.getPassword() == "secret");
    

    发送请求时,您将只使用此代码的第一部分(停在cred.authenticate(request))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多