如何使用POCO使用HTTP基本身份验证做HTTP帖子

How do I make an HTTP Post with HTTP Basic Authentication, using POCO?

本文关键字:HTTP 身份验证 帖子 POCO 使用 何使用      更新时间:2023-10-16

我正在尝试使用POCO使用HTTP Basic Authentication(ClearText用户名和密码)进行HTTP帖子。我找到了一个get的例子,并试图修改它,但是作为新秀,我认为我已经将其弄脏了。有人知道该怎么做吗?

是的,我已经看过另一个问题:POCO C -Net SSL-如何发布HTTPS请求,但是我无法理解它如何实现用户名和密码部分。我也不了解" X-WWW-Form-urlenCoded"的使用。这是帖子需要的吗?我没有表格。只想用用户名和密码参数发布到服务器。

最后。这是您这样做的方式:

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

执行HTTP帖子时,通常以两种形式发送到服务器的数据:

  • 名称,名称和价值由" ="分开的值对,而不同的对被"&amp;"分开。例如:var1=value1&var2=value2。同样,这些名称值对也会发送,以便某些特殊字符和非alphanumericer字符被%HH,一个百分比和两个代表该字符ASCII代码的十六进制数字替换。例如,如果第一个参数的值包含一个"#",则将其发送为var1=value1%23&var2=value2。在以这种格式发送数据时,要求客户端插入具有值application/x-www-form-urlencoded的内容类型标头,以便服务器可以正确解码数据。

  • 作为多部分哑剧主体,每个零件的大小都可以大,还包括"非排放"数据(包括二进制数据)。不同的MIME零件由未出现在任何MIME"有效载荷"中的字符串定界符(边界)分开。在以这种格式发送数据时,客户需要插入具有值multipart/form-data的内容类型标头。

在您引用过的先前的堆叠式问题的情况下,请求主体是以上述方式发送的。希望澄清。

问候,siddharth

来自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))。