博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络通信第四课 C++发送Post请求的完整案例
阅读量:7124 次
发布时间:2019-06-28

本文共 3217 字,大约阅读时间需要 10 分钟。

说明

当前例子采用boost asio库发送HTTP数据报文,采用boost::asio::streambuf request流封装数据报文,在例子的后面

通过string对响应数据包进行分析,获取其中的json格式数据包

#include <iostream>

#include <fstream>

#include <string>

#include <boost/asio.hpp>

using namespace std;

using namespace boost::asio;

unsigned char ToHex(unsigned char x)

{

return  x > 9 ? x + 55 : x + 48;

}

unsigned char FromHex(unsigned char x)

{

unsigned char y;

if (x >= 'A' && x <= 'Z') y = x - 'A' + 10;

else if (x >= 'a' && x <= 'z') y = x - 'a' + 10;

else if (x >= '0' && x <= '9') y = x - '0';

else assert(0);

return y;

}

std::string UrlEncode(const std::string& str)

{

std::string strTemp = "";

size_t length = str.length();

for (size_t i = 0; i < length; i++)

{

if (isalnum((unsigned char)str[i]) ||

(str[i] == '-') ||

(str[i] == '_') ||

(str[i] == '.') ||

(str[i] == '~') ||

(str[i] == '&') ||

(str[i] == '='))

strTemp += str[i];

else if (str[i] == ' ')

strTemp += "+";

else

{

strTemp += '%';

strTemp += ToHex((unsigned char)str[i] >> 4);

strTemp += ToHex((unsigned char)str[i] % 16);

}

}

return strTemp;

}

std::string UrlDecode(const std::string& str)

{

std::string strTemp = "";

size_t length = str.length();

for (size_t i = 0; i < length; i++)

{

if (str[i] == '+') strTemp += ' ';

else if (str[i] == '%')

{

assert(i + 2 < length);

unsigned char high = FromHex((unsigned char)str[++i]);

unsigned char low = FromHex((unsigned char)str[++i]);

strTemp += high * 16 + low;

}

else strTemp += str[i];

}

return strTemp;

}

int HttpPost()

{

// char szSrcBuffer[1024] = { "authorJson={loginAccount:\"admin\"}&parmJson={code:\"SheBeiLiXianGaoJingShangChuan\",params:{id:\"123456\",remarks:\"fire alarm\",time_alarm:\"2017-1-1\",alarm_source:\"192.168.1.11\"}}" };

char szSrcBuffer[1024] = { "authorJson={loginAccount:\"admin\"}&parmJson={code:\"SheBeiLiXianChaXun\",params:{}}" };

std::string strUrlEnCodedBuffer = UrlEncode(szSrcBuffer);

io_service iosev;

ip::tcp::socket socket(iosev);

ip::tcp::endpoint ep(ip::address_v4::from_string("192.168.0.88"), 8080);

boost::system::error_code ec;

socket.connect(ep, ec);

if (ec) return -1;

boost::asio::streambuf request;

std::ostream request_stream(&request);

request_stream << "POST /cs/restfull/operationRestfullApi/excuteSqlByCode HTTP/1.1\r\n";

request_stream << "Host: 192.168.0.88:8080\r\n";

//request_stream << "Connection: keep-alive\r\n";

request_stream << "Content-Length: " << strUrlEnCodedBuffer.size() << "\r\n";

request_stream << "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";

//request_stream << "User-Agent: Mozilla/4.0\r\n";

//request_stream << "Accept-Language: zh-CN\r\n\r\n";

request_stream << "\r\n";

request_stream << strUrlEnCodedBuffer;

size_t len = boost::asio::write(socket, request);

char szRecvBuf[1024] = { 0 };

socket.read_some(buffer(szRecvBuf), ec);

std::cout << "Http Response Context:" << std::endl;

std::cout << szRecvBuf << std::endl;

std::string strRecvBuf = szRecvBuf;

int nIndexOfBody = strRecvBuf.find("\r\n\r\n", 0);

if (nIndexOfBody < 0) return -1;

std::string strHttpBody = strRecvBuf.substr(nIndexOfBody + 4);

std::cout << "Http Body Context:" << std::endl;

std::cout << strHttpBody << std::endl;

return 0;

}

     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1956067,如需转载请自行联系原作者
你可能感兴趣的文章
Spring 注解
查看>>
11gR2游标共享新特性带来的一些问题以及_cursor_features_enabled、_cursor_obsolete_threshold和106001 event...
查看>>
ThoughtWorks读书路线图
查看>>
bash中的转义
查看>>
word 技巧--单词自动换行并添加不间断连字符--公式
查看>>
Apache Bloodhound 0.5.3 发布,项目跟踪
查看>>
如何根据事物代码查找相应BAPI【转】
查看>>
调用BIEE提供的web service
查看>>
密码主页jQuery插件的应用(注册时的验证)
查看>>
CentOS安装ntfs-3g
查看>>
VC字符串转换(转)
查看>>
UIScrollViewDelegate
查看>>
控件视图Android 自定义视图容器控件拦截ontouch事件传递给其子控件
查看>>
Protocol and DataType
查看>>
PHP使用DOMDocument 操作xml
查看>>
【程序6】 求最大公约数和最小公倍数
查看>>
【Android教程】Android用户系统管理
查看>>
熬之滴水穿石:JSP--HTML中的JAVA代码(6)
查看>>
JavaScript小例子:复选框全选
查看>>
Mini-XML 程序员开发手册, Version 2.5(转)
查看>>