私はC++アプリケーションからレストサーバーに接続する必要があります。私の問題はサーバーが提供するトークンアクセスを送信するときです。HTTP GET request with boost C++ - oauth2アクセストークン
私はいくつかの方法で試しましたが、正しい構文が見つかりません。
残りのサーバーは認証にoauth2を使用し、トークンの種類はベアラです。私はこの構文を見つけoauth1で
:
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0\r\n";
request_stream << "Host: " << server << "\r\n";
request_stream << "Content-Type: application/x-www-form-urlencoded\r\n";
request_stream << "Authorization: OAuth oauth_version=\"1.0\", "
<< oauth_signature_method=\"PLAINTEXT\", "
<<"oauth_consumer_key=\"<key>\", "
<<"oauth_signature=\"<secret>&\"\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";
でものOAuth2のために、私は正しい構文を見つけることができません。
私は2をハイライト表示されます行ったすべての試行の:
1.
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0\r\n";
request_stream << "Host: " << server << "\r\n";
request_stream << "Authorization: Bearer accesstoken\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";
エラーが返さ: "例外:未指定のファイル(1):終端されていない文字列"
2。
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0\r\n";
request_stream << "Host: " << server << "\r\n";
request_stream << "Content-Type: application/x-www-form-urlencoded\r\n";
request_stream << "Authorization: OAuth oauth_version=\"2.0\", "
<<"oauth_token_type=\"Bearer\", "
<<"oauth_access_token=\"accesstoken\"\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";
エラーが返されました:「ステータスコード401で返された応答」
また、どちらの場合も行の最後に "\ r \ n"を付けずに試しても動作しません。
request_stream << "Authorization: Bearer accesstoken";
request_stream << "Authorization: OAuth oauth_version=\"2.0\", "
<<"oauth_token_type=\"Bearer\", "
<<"oauth_access_token=\"accesstoken\"";
私は、サーバーへのアクセストークンを送信するように要求「認可」の正しいテキスト文字列を必要とする:
request_stream << "Authorization: ??????? \r\n";
誰もがアクセストークンを送信するための正しい構文を知っていますか?
ありがとうございます!編集
- 11月18日
は、残りのサーバーがSymfony2のとfosrestbundleで作られていることを言及するのを忘れ。サービスを適切に設定するには、fosrestbundleがそれをよく知っている必要があります。そうしないと、問題が発生する可能性があるからです。
私はsymfony3とfirebase-jwtを使って残りの部分をテストしています。これまで外のバンドルにいなくても、ほとんどすべてを設定できるので、問題はないと思います。
私はsymfony3とfosrestbundleを試していませんが、fosrestbundleは正しく設定するためにはよく知っている必要があります。
私はこのバンドルに関するより高度な知識が必要とされていると言えば、それは私がやった他のアプリケーション、例えばアンドロイドアプリケーションから私がうまく機能するからです。しかし、C++アプリケーションからは私に問題があります。
私はこの情報は私がsymfony3とfirebase-JWTで試してみました
編集11月21日
誰かのために有用であると思いますし、それは私と同じエラーを与え続けています。
私はfosrestbundleに間違っていました。実際、両方のサーバ(fosrestbundleとsymfony3-jwt)は認証を行い、クライアントから要求されたデータを正しく送信します。
問題は、クライアント側にある:
void Restclient::handle_read_content(const boost::system::error_code& err)
{
if (!err)
{
std::ostringstream ss;
ss << &response_;
std::string s = ss.str();
boost::property_tree::ptree pt2;
stringstream is (s);
boost::property_tree::read_json (is, pt2);
boost::asio::async_read(socket_, response_, boost::asio::transfer_at_least(1), boost::bind(&Restclient::handle_read_content, this, boost::asio::placeholders::error));
}
else if (err != boost::asio::error::eof)
{
std::cout << "Error: " << err << "\n";
}
}
いくつかのテストを実行した後、私はエラーが発生した場所を正確に、このラインであることが検証:
boost::property_tree::read_json (is, pt2);
JSONがよく届きます。(例えば
{ "Data1": "C++", "data2": "java", "data3": "python", "data4": "php", "data5": "C#"}
私は実際のjsonを置くつもりはない長い文字列ですが、それはちょうどあなたにアイデアを与えることです。
そして読書の瞬間に
とJSONに変換し、これが表示されます。私はここにさらさ{ "Data1": "C++", "data2": "java", "data3": "python", "dat
Exception: <unspecified file> (1): unterminated string
コードがブーストC++ async_clientの例に基づいているが、それは私にその問題を提供します。
誰かがこの問題を解決した場合、私はあなたの助けに感謝します。
編集 - 11月27日[解決しよう]
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0\r\n";
request_stream << "Host: " << server << "\r\n";
request_stream << "Authorization: Bearer accesstoken\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Content-Length: 0\r\n\r\n";
void Restclient::handle_read_content(const boost::system::error_code& err)
{
if (!err)
{
boost::system::error_code error;
string result = "";
//Read the answer to the end
while (boost::asio::read(socket_, response_, boost::asio::transfer_at_least(1), error))
{
std::ostringstream ss;
ss << &response_;
std::string output = ss.str();
result = result + output;
}
//If the answer has already arrived and there is nothing left to read
if (error == boost::asio::error::eof)
{
stringstream is (result);
boost::property_tree::ptree pt2;
boost::property_tree::read_json (is, pt2);
}
boost::asio::async_read(socket_, response_, boost::asio::transfer_at_least(1), boost::bind(&Restclient::handle_read_content, this, boost::asio::placeholders::error));
}
else if (err != boost::asio::error::eof)
{
std::cout << "Error: " << err << "\n";
}
}
JSONはあなたには、いくつかのHTTP
書式設定の問題を持って完了し、ptreeでは
このようなことを簡単にデバッグするには、OAuth2で動作する簡単なAPIを提供するライブラリ(例:python)で試してみてください。それがうまくいくならば、トレースツールを使ってヘッダーでそのライブラリが何を送信しているか把握するのが非常に簡単です – Arunmu