4

POCO を使用して、HTTP 基本認証 (クリアテキストのユーザー名とパスワード) で HTTP 投稿を作成しようとしています。Get の例を見つけて、それを変更しようとしましたが、新人なので、役に立たないほど壊してしまったと思います。誰でもこれを行う方法を知っていますか?

はい、私はすでにこれに関する他の SO の質問を見てきました: POCO C++ - NET SSL - how to POST HTTPS requestですが、ユーザー名とパスワードの部分を実装しようとしている方法がわかりません。「x-www-form-urlencoded」の使い方もわかりません。これは投稿に必要ですか? フォームがありません。ユーザー名とパスワードのパラメーターを使用してサーバーに POST したいだけです。

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を実行すると、通常、サーバーに送信されるデータは次の2つの形式のいずれかで送信されます。

  • 名前と値のペアは「=」で区切られ、個別のペアは「&」で区切られます。例:var1=value1&var2=value2。また、これらの名前と値のペアは、特定の特殊文字と英数字以外の文字が%HH、文字のASCIIコードを表すパーセント記号と2桁の16進数に置き換えられるように送信されます。たとえば、最初のパラメータの値に「#」が含まれている場合、それはとして送信されvar1=value1%23&var2=value2ます。この形式でデータを送信する場合application/x-www-form-urlencoded、サーバーがデータを正しくデコードできるように、クライアントは値を含むContent-Typeヘッダーを挿入する必要があります。

  • マルチパート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 に答える