本文作者:abqchina,来自原文地址贴上微信小程序发送http请求代码: - onsend: function(){
- wx.request({
- url: '', //c++后台ip、端口
- data: {
- x: '1' ,
- y: '2'
- },
- header:{
- "Content-Type":"application/json"
- },
- method:"POST",
- success: function(res) {
- var data = res.data;
- console.log(data);
- }
- });
- }
c++后台代码借鉴boost官网的asio的http server 3地址并自己做了修改:官网地址: 修改代码: 1、request_parser.hpp: -
-
-
-
-
-
-
-
-
-
- #ifndef HTTP_SERVER3_REQUEST_PARSER_HPP
- #define HTTP_SERVER3_REQUEST_PARSER_HPP
-
- #include <boost/logic/tribool.hpp>
- #include <boost/tuple/tuple.hpp>
-
- namespace http {
- namespace server3 {
-
- struct request;
-
-
- class request_parser
- {
- public:
-
- request_parser();
-
-
- void reset();
-
-
-
-
-
- template <typename InputIterator>
- boost::tuple<boost::tribool, InputIterator> parse(request& req,
- InputIterator begin, InputIterator end)
- {
- if(req.method=="POST") state_ = expecting_newline_4;
- while (begin != end)
- {
- boost::tribool result = consume(req, *begin++);
-
- if (state_ != none && (result || !result)){
-
- if(req.method=="POST"){
- char c = *begin;
- if(c=='\0') break;
- state_ = expecting_newline_4;
- result = consume(req, *begin++);
- }
-
- }
- if (result || !result){
- return boost::make_tuple(result, begin);
- }
- }
- boost::tribool result = boost::indeterminate;
- return boost::make_tuple(result, begin);
- }
-
- private:
-
- boost::tribool consume(request& req, char input);
-
-
- static bool is_char(int c);
-
-
- static bool is_ctl(int c);
-
-
- static bool is_tspecial(int c);
-
-
- static bool is_digit(int c);
-
-
- enum state
- {
- method_start,
- method,
- uri_start,
- uri,
- http_version_h,
- http_version_t_1,
- http_version_t_2,
- http_version_p,
- http_version_slash,
- http_version_major_start,
- http_version_major,
- http_version_minor_start,
- http_version_minor,
- expecting_newline_1,
- header_line_start,
- header_lws,
- header_name,
- space_before_header_value,
- header_value,
- expecting_newline_2,
- expecting_newline_3,
- expecting_newline_4,
- none
- } state_;
- };
-
- }
- }
-
- #endif // HTTP_SERVER3_REQUEST_PARSER_HPP
2、- bool request_parser::is_tspecial(int c)
- {
- switch (c)
- {
- case '(': case ')': case '<': case '>': case '@':
- case ',': case ';': case ':': case '\\': case '"':
- case '/': case '[': case ']': case '?': case '=':
- case '{': case '}': case ' ': case '\t':
- return true;
- default:
- return false;
- }
- }
-
- bool request_parser::is_digit(int c)
- {
- return c >= '0' && c <= '9';
- }
-
- }
- }
3、
3、针对request_handler类增加了自己处理客户端请求函数,不用官方的
- void request_handler::handle_request(const request& req)
- {
- if(req.method=="POST"){
-
- Json::Reader reader;
- Json::Value jsonval;
- if(!(reader.parse(req.post,jsonval)))
- {
- std::cerr << "json解析错误:" << req.post << std::endl;
- return ;
- }
- std::string funcid = jsonval["x"].asString();
- std::string content = jsonval["y"].asString();
- std::cout << "收到客户端请求:" <<req.post<< std::endl;
- }else{
- std::cout << "收到客户端请求:" <<req.uri.substr(2,req.uri.length())<< std::endl;
- std::string str = req.uri;
- std::vector<std::string> vecSegTag;
- boost::split(vecSegTag, str, boost::is_any_of(("/?&=")));
- m_MapContent.clear();
- for(int i = 2; i < vecSegTag.size() - 1; ){
- m_MapContent.insert(std::pair<std::string, std::string>(vecSegTag[i], vecSegTag[i+1]));
- i += 2;
- }
- }
- }
4、connection类修改handle_read函数增加自己处理客户的请求函数- void connection::handle_read(const boost::system::error_code& e,
- std::size_t bytes_transferred)
- {
- if (!e)
- {
- boost::tribool result;
- boost::tie(result, boost::tuples::ignore) = request_parser_.parse(
- request_, buffer_.data(), buffer_.data() + bytes_transferred);
-
- buffer_.assign('\0');
- if (result)
- {
- request_handler_.handle_request(request_);
-
-
-
- reply_.status = reply::ok;
- char buf[512] = {"hello"};
-
- reply_.content.append(buf);
- reply_.headers.resize(2);
- reply_.headers[0].name = "Content-Length";
- reply_.headers[0].value = boost::lexical_cast<std::string>(reply_.content.size());
- reply_.headers[1].name = "Content-Type";
- reply_.headers[1].value = mime_types::extension_to_type("");
-
- boost::asio::async_write(socket_, reply_.to_buffers(),
- strand_.wrap(
- boost::bind(&connection::handle_write, shared_from_this(),
- boost::asio::placeholders::error)));
- }
- else if (!result)
- {
- reply_ = reply::stock_reply(reply::bad_request);
- boost::asio::async_write(socket_, reply_.to_buffers(),
- strand_.wrap(
- boost::bind(&connection::handle_write, shared_from_this(),
- boost::asio::placeholders::error)));
- }
- else
- {
- socket_.async_read_some(boost::asio::buffer(buffer_),
- strand_.wrap(
- boost::bind(&connection::handle_read, shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred)));
- }
- }
-
-
-
-
-
- }
3、针对request_handler类增加了自己处理客户端请求函数,不用官方的- void request_handler::handle_request(const request& req)
- {
- if(req.method=="POST"){
-
- Json::Reader reader;
- Json::Value jsonval;
- if(!(reader.parse(req.post,jsonval)))
- {
- std::cerr << "json解析错误:" << req.post << std::endl;
- return ;
- }
- std::string funcid = jsonval["x"].asString();
- std::string content = jsonval["y"].asString();
- std::cout << "收到客户端请求:" <<req.post<< std::endl;
- }else{
- std::cout << "收到客户端请求:" <<req.uri.substr(2,req.uri.length())<< std::endl;
- std::string str = req.uri;
- std::vector<std::string> vecSegTag;
- boost::split(vecSegTag, str, boost::is_any_of(("/?&=")));
- m_MapContent.clear();
- for(int i = 2; i < vecSegTag.size() - 1; ){
- m_MapContent.insert(std::pair<std::string, std::string>(vecSegTag[i], vecSegTag[i+1]));
- i += 2;
- }
- }
- }
|