boost c++库文字处理问题,大手进!

zhouchaojian138 2017-02-07 07:02:52
[size=40px]下面是网友写的boost模拟post的代码,效果是实现了,但是获取到的字符串是括号里的("3f\r\n{\"errno\":\"0\",\"errmsg\":\"success\",\"lastpoint\":\"2017-02-07-18-36\"}\r\n0\r\n\r\n")换了其它的post请求都发现前几位固定是返回十六位的响应长度,这里面是3f,这么下去要是响应很长前几位还真不一定几位了,我的想法是截取第一个\r\n到第二个\r\n之间的数据,可是硬伤有了,只会c#的,我的目的是:让sc的值就是相应内容({\"errno\":\"0\",\"errmsg\":\"success\",\"lastpoint\":\"2017-02-07-18-36\"}),你可以这样做:
1、截取返回的字符串,最好用boost给的库函数截取string,用std的不会给太高分。
2、修改方法体,让sc不用截取就是响应内容~(好像是一回事),或干脆帮我写个纯boost的post或get请求代码,感激不尽。
贴代码:[/size]



#include<iostream>
#include<string>
#include<stdio.h>
#include"boost/asio.hpp"
#include<fstream>
#include<boost\algorithm\string.hpp>



//引入namespace
using namespace boost;
using namespace std;
using boost::asio::ip::tcp;

//引入namespace

/// GET请求
string PostRequest(string host, string path,string form)
{
long length = form.length();

// 声明Asio基础: io_service(任务调度机)
boost::asio::io_service io_service;

// 获取服务器终端列表
tcp::resolver resolver(io_service);
tcp::resolver::query query(host, "http");
tcp::resolver::iterator iter = resolver.resolve(query);

// 尝试连接每一个终端,直到成功建立socket连接
tcp::socket socket(io_service);
boost::asio::connect(socket, iter);

// 构建网络请求头
// 指定 "Connection: close" 在获取应答后断开连接,确保获文件全部数据。
boost::asio::streambuf request;
ostream request_stream(&request);
request_stream << "POST " << path << " HTTP/1.1\r\n";
request_stream << "Host: " << host << "\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Content-Type:application/x-www-form-urlencoded\r\n";
request_stream << "Content-Length: " << length << "\r\n";
request_stream << "Connection: close\r\n\r\n"; // 注意这里是两个空行
request_stream << form; //POST 发送的数据本身不包含多于空行

// 发送请求
boost::asio::write(socket, request);

// 读取应答状态. 应答缓冲流 streambuf 会自动增长至完整的行
// 该增长可以在构造缓冲流时通过设置最大值限制
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");

// 检查应答是否OK.
istream response_stream(&response);// 应答流
string http_version;
response_stream >> http_version;
unsigned int status_code;
response_stream >> status_code;
string status_message;
getline(response_stream, status_message);
if (!response_stream || http_version.substr(0, 5) != "HTTP/")
{
printf("无效响应\n");
}
if (status_code != 200)
{
printf("响应返回 status code %d\n", status_code);
}

// 读取应答头部,遇到空行后停止
boost::asio::read_until(socket, response, "\r\n\r\n");

// 显示应答头部
string header;
int len = 1;
while (getline(response_stream, header) && header != "\r" && header !="\r\n")
{
/*if (header.find("Content-Length: ") == 0) {
stringstream stream;
stream << header.substr(16);
stream >> len;
}*/
}

long size = response.size();

if (size > 0) {
// .... do nothing
}

// 循环读取数据流,直到文件结束
boost::system::error_code error;
while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error))
{
// 获取应答长度
size = response.size();
if (len != 0) {
cout << size << " Byte " << (size * 100) / len << "%\n";
}

}
if (error != boost::asio::error::eof)
{
throw boost::system::system_error(error);
}
// 将streambuf类型转换为string类型返回
istream is(&response);
is.unsetf(ios_base::skipws);
string sz;
sz.append(istream_iterator<char>(is), istream_iterator<char>());

// 返回转换后的字符串
return sz;
}

int main()
{
cout << PostRequest("task.browser.360.cn", "/online/setpoint", "stamp=1485856383&qt=Q%3Du%3D%25O4%25S3%25OQ%25N1008%26n%3D%25O4%25S3%25OQ%25N1008%26le%3DqvH0ZUMeMKVhL2Z%3D%26m%3DZGt4WGWOWGWOWGWOWGWOWGWOZQN3%26qid%3D49871531%26im%3D1%5Ft01281fc12930368b13%26src%3D360se%26t%3D1%0D%0AT%3Ds%3D0a9351aa131bc7b8dd23726e3ebdafad%26t%3D1483137678%26lm%3D%26lf%3D1%26sk%3D6f360194503d7fff701e6bfab6645364%26mt%3D1483137678%26rc%3D1%26v%3D2%2E0%26a%3D1&verify=86f47277614701445350a48e4182a076");
getchar();
return 0;
}

...全文
817 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧