如何使用POCO使用HTTP基本身份验证创建HTTP Post?

时间:2012-10-31 19:07:02

标签: http post passwords basic-authentication poco-libraries

我正在尝试使用POCO制作带有HTTP基本身份验证的HTTP帖子(明文用户名和密码)。我找到了一个Get的例子,并尝试修改它,但作为一个新手,我想我已经把它毁了它的用处。有谁知道怎么做?

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

3 个答案:

答案 0 :(得分:10)

最后。这是你如何做到的:

    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

答案 1 :(得分:3)

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

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

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

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

此致 亚洲时报Siddharth

答案 2 :(得分:1)

从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)处停止)。