• c++ rest websocket的使用方式


    1. rest使用方式

    (1)GET

     http_client restclient("https://test.123456.com");   // base url  
     http_request request(methods::GET);
            
     request.headers().add("TestKey", "TestValue");
     request.headers().add("Content-Type", "application/json");
           
     uri_builder builder("/api/test/get_something");   // 是base url后边的地址
       builder.append_query("price", 100);
       char temp[24];
       sprintf(temp, "%.8f", 20);
       builder.append_query("amount", temp);
       builder.append_query("label", "123456");
       builder.append_query("name", "test");
       builder.append_query("type", "new");
     request.set_request_uri(builder.to_string()); // builder.to_string() = /api/test/get_something?price=100.0000&amount=20.00000000&label=123456&name=123456&type=new
    
     restclient.request(request).then([](http_response response) -> pplx::task<json::value> {
         // if the status is OK extract the body of the response into a JSON value works only when the content type is application\json
         auto code = response.status_code();//400, 401, 418, 429
         if(code == status_codes::OK || code == status_codes::BadRequest || code == status_codes::TooManyRequests || code == status_codes::Unauthorized) 
         {
             return response.extract_json();
         }
          throw exception();
          return pplx::task_from_result(json::value());  // return an empty JSON value
    }).then([&](pplx::task<json::value> previousTask) { // get the JSON value from the task and display content from it 
    try {
    json::value const & v = previousTask.get();
    } catch (http_exception const & e) {
         throw exception();
    }
    }) .wait();

    (2) POST 

     http_client restclient("https://test.123456.com"); 
    http_request request(methods::PUT); request.headers().add(
    "TestKey", "TestValue"); request.headers().add("Content-Type", "application/json"); uri_builder builder("api/test/put_something"); request.set_request_uri(builder.to_string());

    json::value body; body["price"] = json::value::number(100); body["amount"] = json::value::amount(10); body["label"] = json::value::string("123456"); body["name"] = json::value::number("test"); body["type"] = json::value::number("new"); request.set_body(body.serialize()); // body.to_string() = {"price":100,"amount":10,"label":"123456","name":"test","type":"new"} restclient.request(request).then([](http_response response) -> pplx::task<json::value> { // if the status is OK extract the body of the response into a JSON value works only when the content type is application\json auto code = response.status_code(); //400, 401, 418, 429 if(code == status_codes::OK || code == status_codes::BadRequest || code == status_codes::TooManyRequests || code == status_codes::Unauthorized) { return response.extract_json(); } throw exception(); // return an empty JSON value return pplx::task_from_result(json::value()); }).then([&](pplx::task<json::value> previousTask) { // get the JSON value from the task and display content from it try { json::value const & v = previousTask.get(); } catch (http_exception const & e) { throw exception(); } }).wait();
    2. websocket连接,接收,订阅
        uri_builder builder("wss://test.123456.com");
        builder.append_path("/ws/api/test");
          websocket_callback_client  m_wsclient;
        m_wsclient.close();
        m_wsclient.connect(builder.to_string())
        .then([&]() { 
            std::function<void (const websocket_incoming_message &msg)> f;
            f = std::bind(&TestClass::On_WebSocketMsg, this, placeholders::_1);
            m_wsclient.set_message_handler(f);
            std::function<void (websocket_close_status close_status,
                                    const utility::string_t& reason,
                                    const std::error_code& error)> c;
            c =  std::bind(&TestClass::On_CloseMsg, this, placeholders::_1, placeholders::_2, placeholders::_3);
            m_wsclient.set_close_handler(c);
        })
        .wait();

    class TestClass {
      public:
        void On_WebSocketMsg(const websocket_incoming_message& msg) {
        auto type = (int)msg.message_type();
           if (type == 2 || type == 3) {
          // send ping
        } else if (type == 0) {
          msg.extract_string().then([](const string s) {
            web::json::value res = json::value::parse(s.c_str());
            if (res.has_field("result")) {
            }
          })
        }
      }

        void On_CloseMsg(websocket_close_status close_status, const utility::string_t& reason, const std::error_code& error) {
        }
     
      void Ping() {
        websocket_outgoing_message out_msg;
        out_msg.set_ping_message();
        m_wsclient.send(out_msg);
      }
     
      void Pong() {
        websocket_outgoing_message out_msg;
        out_msg.set_pong_message();
        m_wsclient.send(out_msg);
      }
     
      void Subscribe() {
         websocket_outgoing_message out_msg;
          json::value msg;
          //msg["method"] = json::value::string("public/subscribe");
          msg["method"] = json::value::string("private/subscribe");
          //json::value channel = json::value::string("ticker.BTC-11MAR22-30000-C.100ms");
          json::value channel = json::value::string("user.orders.BTC-PERPETUAL.100ms");
          vector<json::value> v;
          v.push_back(channel);

          json::value params;
          params["channels"] = json::value::array(v);
          params["access_token"] = json::value::string("access_token");  // 添加认证方式(如果需要的话)
          msg["params"] = params;
          std::cout << msg.to_string() << std::endl;
     
          out_msg.set_utf8_message(msg.serialize());
          m_wsclient.send(out_msg);
      }
    };

     

  • 相关阅读:
    PHP中Foreach在引用时的陷阱 j神
    Yii中Session和cookie的用法 j神
    如何解决web大流量、高并发的问题 j神
    PHP无限级分类的递归算法 j神
    关于breadcrumbs j神
    MySQL索引分析和优化 j神
    Yii笔记 j神
    YII中的URL Management j神
    forward与redirect的区别 j神
    网络编程学习笔记
  • 原文地址:https://www.cnblogs.com/sssblog/p/15988837.html
Copyright © 2020-2023  润新知