Restbed: проблема, когда я пытаюсь сделать запрос, содержащий параметр JSON - PullRequest
0 голосов
/ 14 марта 2019

Я довольно новичок в 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={}) я получаю сообщение об ошибке «Ваш клиент отправил неверную или недопустимую строку состояния запроса. Это все, что мы знаем». Я могу решить эту проблему, выполнив эту команду из Почтальона, а не из браузера, но даже тогда, когдакак только я изменяю команду на http://localhost/resource?request={"test"=[]}, она снова заканчивается той же ошибкой.

Может кто-нибудь пролить свет на то, на какую проблему я смотрю? У меня работает 64-битная Windows 10, компилируетсякод в Visual Studio 2017.

Заранее спасибо

1 Ответ

0 голосов
/ 15 марта 2019

Конечно, это была ошибка новичка :).Почтальон не закодировал 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, текст).

...