带有boost oauth2访问令牌的HTTP GET请求
HTTP GET request with boost oauth2 access token
我需要从c++应用程序连接到rest服务器,我的问题是在发送服务器提供的令牌访问时。
我试了好几种方法,但都找不到正确的语法。
其余服务器使用oauth2进行身份验证,令牌类型为承载。
在oauth1中,我发现了这个语法:
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0rn";
request_stream << "Host: " << server << "rn";
request_stream << "Content-Type: application/x-www-form-urlencodedrn";
request_stream << "Authorization: OAuth oauth_version="1.0", "
<< oauth_signature_method="PLAINTEXT", "
<<"oauth_consumer_key="<key>", "
<<"oauth_signature="<secret>&"rn";
request_stream << "Accept: */*rn";
request_stream << "Connection: closernrn";
但是对于oauth2,我找不到正确的语法。
在我所做的所有尝试中,我将强调2:
1。
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0rn";
request_stream << "Host: " << server << "rn";
request_stream << "Authorization: Bearer accesstokenrn";
request_stream << "Accept: */*rn";
request_stream << "Connection: closernrn";
错误返回:"异常:未指定文件(1):未终止字符串"
2。
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0rn";
request_stream << "Host: " << server << "rn";
request_stream << "Content-Type: application/x-www-form-urlencodedrn";
request_stream << "Authorization: OAuth oauth_version="2.0", "
<<"oauth_token_type="Bearer", "
<<"oauth_access_token="accesstoken"rn";
request_stream << "Accept: */*rn";
request_stream << "Connection: closernrn";
返回错误:"响应返回状态码401"
另外,在这两种情况下,尝试在行尾不加" r n",但它不起作用。
request_stream << "Authorization: Bearer accesstoken";
request_stream << "Authorization: OAuth oauth_version="2.0", "
<<"oauth_token_type="Bearer", "
<<"oauth_access_token="accesstoken"";
我需要请求"Authorization"的正确文本字符串来将访问令牌发送到服务器:
request_stream << "Authorization: ??????? rn";
有人知道发送访问令牌的正确语法吗?
谢谢! !
编辑- Nov 18
忘记提及其余服务器是使用symfony2和fosrestbundle创建的。显然,fosrestbundle需要很好地了解它才能正确配置服务,否则它可能会出现问题。
现在我用symfony3和firebase-jwt测试rest。我想我不会有问题,因为我可以配置几乎所有的东西,而不必在外部包中走那么远。
我没有尝试过symfony3和fosrestbundle,但似乎fosrestbundle需要很好地了解它才能正确配置。
当我说需要更多关于这个bundle的高级知识时,这是因为它在我做的其他应用程序中工作得很好,例如android应用程序;但从c++应用程序给我的问题。
我希望这些信息对某人有用
11月21日编辑
我尝试了symfony3和firebase-jwt,它一直给我同样的错误。
我用错了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
我在这里暴露的代码是基于boost c++ async_client的示例,但它给了我这个问题。
如果有人已经解决了这个问题,我将非常感谢你的帮助。
Edit - Nov - 27 [SOLVED]
std::ostream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0rn";
request_stream << "Host: " << server << "rn";
request_stream << "Authorization: Bearer accesstokenrn";
request_stream << "Accept: */*rn";
request_stream << "Content-Length: 0rnrn";
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完成,ptree正确生成
您有一些HTTP
格式问题。
你的请求都没有发送消息体的大小(在你的情况下为零),因为你发送HTTP 1.0
请求,没有必要发送Connection: close
,服务器应该在发送响应后关闭连接。如果您不想要这种行为,那么将HTTP/1.0
更改为HTTP/1.1
。
尝试替换尝试2的最后一行:
request_stream << "Connection: closernrn";
:
request_stream << "Content-Length: 0rnrn";
您应该收到200
(OK)或401
(未授权)响应。
语法在HTTP规范RFC7230中定义,特别是RFC7235用于身份验证。
- c++程序,在windows下发送带有参数的http get请求
- Qt中HTTP GET响应上的奇怪编码
- 推迟 HTTP GET 响应,直到用户更改数据库中的值
- 使用 C++ 套接字发出 HTTP GET 请求时出现 301 错误
- 如何编写Qt HTTP GET请求
- 在HTTP/GET后几秒钟引发Poco::Net::NoMessageException
- 如何使用Java发送HTTP GET,并使用用C++编写的CGI应用程序打印QUERY_STRING环境变量
- 使用带有gsoap代理类的gsoap独立服务器实现http-get
- 使用boost::asio发送http GET请求,类似于cURL
- 使用C++获取HTTP get参数
- 如何在Qt/C++中访问HTTP GET/POST API
- C++HTTP GET请求问题
- libcurl C++添加 HTTP get 参数
- 带有参数的 HTTP GET 请求
- 使用http get下载图片只会下载其中的一小部分
- 在c++中获取字节范围的HTTP GET请求
- 带有boost oauth2访问令牌的HTTP GET请求
- 使用套接字的c++ HTTP GET
- Google.Com 上的 http GET 请求返回"Error 302 page has been moved"
- QT HTTP GET,怎么了?