C++ 网络:请求方法 POST

C++ Networking: Request method POST

我正在尝试与某些服务器通信。要获得用户名(有权限),我需要做一些类似注册的事情:HTTP 请求方法 POST 发送 json-like body containing {"devicetype": "devicename"}。 O 尝试用 ASIO 库来做。

asio::error_code ec;
asio::io_context context;
asio::ip::tcp::endpoint endpoint(asio::ip::make_address("ipAddress", ec), 80);
asio::ip::tcp::socket socket(context);
if (!ec)
    {
        std::cout << "Succesfully connected\n";
    }
    else
    {
        std::cout << "Failed to connect to address: \n" << ec.message() << std::endl;
    }
if (socket.is_open())
    {
std::string sRequest =
            "POST /api HTTP/1.1\r\n"
            "Host: ipAddress \r\n"
            "Body: {\"devicetype\": \"devicename\"}"
            "Connection: close\r\n\r\n";
socket.write_some(asio::buffer(sRequest.data(), sRequest.size()), ec);

/*Reading received message and getting error message from server*/
}

错误说:“invalid/missing 正文中的参数”。参数正确。问题可能出在我发送的消息格式 (sRequest) 上。我如何指定 json 消息正文?

感谢您的帮助。

您显示的不是格式正确的 HTTP 请求。 HTTP 中没有 Body header。 JSON 数据需要在终止 header 的 \r\n\r\n 之后。并且您需要添加 Content-TypeContent-Length header 以便服务器知道您发布的数据类型及其大小。

试试这个:

std::string json = "{\"devicetype\": \"devicename\"}";
std::string sRequest =
            "POST /api HTTP/1.1\r\n"
            "Host: ipAddress\r\n"
            "Content-Type: application/json\r\n"
            "Content-Length: " + std::to_string(json.size()) + "\r\n"
            "Connection: close\r\n\r\n" + json;