我正在尝试使用POCO制作带有HTTP基本身份验证的HTTP帖子(明文用户名和密码)。我找到了一个Get的例子,并尝试修改它,但作为一个新手,我想我已经把它毁了它的用处。有谁知道怎么做?
是的,我已经看到了另一个问题:POCO C++ - NET SSL - how to POST HTTPS request,但我无法理解它是如何尝试实现用户名和密码的。我也不明白“x-www-form-urlencoded”的用法。邮政需要这个吗?我没有表格。只想用用户名和密码参数POST到服务器。
答案 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)
处停止)。