【问题标题】:Restbed: issue when i try to make a requst containing JSON parameterRestbed:当我尝试发出包含 JSON 参数的请求时出现问题
【发布时间】:2023-03-23 16:31:01
【问题描述】:

我对 REST 相当陌生,我尝试运行 Restbed 的基本教程代码,如下所示:

#include <memory>
#include <cstdlib>
#include <restbed>

using namespace std;
using namespace restbed;

void get_method_handler( const shared_ptr< Session > session )
{
    session->close( OK, "Hello, World!", { { "Content-Length", "13" }, { "Connection", "close" } } );
}

int main( const int, const char** )
{
    auto resource = make_shared< Resource >( );
    resource->set_path( "/resource" );
    resource->set_method_handler( "GET", get_method_handler );

    //auto ssl_settings = make_shared< SSLSettings >( );
    //ssl_settings->set_http_disabled( true );
    //ssl_settings->set_private_key( Uri( "file:///tmp/server.key" ) );
    //ssl_settings->set_certificate( Uri( "file:///tmp/server.crt" ) );
    //ssl_settings->set_temporary_diffie_hellman( Uri( "file:///tmp/dh768.pem" ) );

    auto settings = make_shared< Settings >( );
    //settings->set_ssl_settings( ssl_settings );

    Service service;
    service.publish( resource );
    service.start( settings );

    return EXIT_SUCCESS;
}

请注意:SSL 初始化已被注释掉。 当我只提出一个基本请求 (http://localhost/resource) 时,一切都很好。 只需包含一个参数 (http://localhost/resource?request=test) 的更复杂的请求,它仍然可以按预期工作。当我尝试传入 JSON 对象 (http://localhost/resource?request={}) 时,我收到一条错误消息,指出“您的客户端发出了格式错误或非法的请求状态行。这就是我们所知道的。”。我可以通过从 Postman 而不是浏览器运行此命令来解决此问题,但即便如此,只要我将命令更改为 http://localhost/resource?request={"test"=[]},它就会再次出现相同的错误。

谁能解释一下我在看什么问题? 我运行 64 位 windows 10,在 Visual Studio 2017 中编译代码。

提前谢谢你

【问题讨论】:

  • 我也遇到了与 Casablanca C++ REST SDK 完全相同的问题,只要我将 [ 或 ] 添加到 URI 就会失败。我正在寻找可能在我的系统中导致此问题的线索:/

标签: c++ rest cpprest-sdk restbed


【解决方案1】:

这当然是新手的错误 :)。邮递员没有为我编码 URL,我花了很长时间才意识到这一点。我已经使用https://www.urlencoder.org/ 对其进行了编码,现在它可以正常工作了。

Unencoded example: {"values":["1", "2"]}
Encoded example: %7B%22values%22%3A%5B%221%22%2C%20%222%22%5D%7D

这篇文章让我大开眼界:https://perishablepress.com/stop-using-unsafe-characters-in-urls/

编辑:我应该补充一点,同时我了解到 JSON 对象作为请求的主体发送要好得多,标头编码为 application/JSON。

据我了解,HTTP 请求包含 URI - 标头和正文。 URI 是请求的地址 (http://localhost:5000/test) 标头指示类型并且可以包含数据,主体包含可以根据标头(二进制、json、文本)进行着色的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2018-02-11
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多