4

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

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

4

3 回答 3

11

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

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
于 2012-11-05T16:58:40.097 回答
3

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

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

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

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

问候, 悉达多

于 2012-10-31T19:33:17.653 回答
2

从 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))。

于 2016-07-14T16:26:10.047 回答