我需要从c ++应用程序连接到休息服务器,我的问题是在发送服务器提供的令牌访问时。
我尝试了几种方法,但我找不到正确的语法。
其余服务器使用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";
返回错误:&#34;例外:未指定的文件(1):未终止的字符串&#34;
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";
返回错误:&#34;返回状态代码为401&#34;
的响应此外,请尝试不使用&#34; \ r \ n&#34;在两种情况下,在行的末尾,但它不起作用。
request_stream << "Authorization: Bearer accesstoken";
request_stream << "Authorization: OAuth oauth_version=\"2.0\", "
<<"oauth_token_type=\"Bearer\", "
<<"oauth_access_token=\"accesstoken\"";
我需要请求的正确文本字符串&#34;授权&#34;将访问令牌发送到服务器:
request_stream << "Authorization: ??????? \r\n";
有没有人知道发送访问令牌的正确语法?
谢谢!
已编辑 - 11月18日
忘了提一下,其余服务器是用symfony2和fosrestbundle制作的。显然fosrestbundle需要了解它才能正确配置服务,否则会产生问题。
现在我用symfony3和firebase-jwt测试休息。我想我不会有问题,因为我可以配置几乎所有东西,而不必在外部捆绑中走得那么远。
我没有尝试使用symfony3和fosrestbundle,但似乎fosrestbundle需要了解它才能正确配置它。
当我说需要有关此捆绑包的更高级知识时,这是因为它对我的其他应用程序非常有用,例如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的例子,但它给了我这个问题。
如果有人解决了这个问题,我将非常感谢您的帮助。
编辑 - 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已完成且ptree正确生成
答案 0 :(得分:0)
您有一些HTTP
格式问题。
您的所有请求都没有发送邮件正文的大小(在您的情况下为零)并且由于您要发送HTTP 1.0
个请求,因此无需发送Connection: close
,服务器应关闭发送响应后的连接。如果您不想要这种行为,请将HTTP/1.0
更改为HTTP/1.1
。
尝试替换尝试2的最后一行:
request_stream << "Connection: close\r\n\r\n";
使用:
request_stream << "Content-Length: 0\r\n\r\n";
您应该收到200
(确定)或401
(未经授权)回复。