Рестлет POST с использованием JSON

Как мне реализовать функцию Restlet, которая принимает JSON пост? И как я могу проверить это с помощью curl?

Спасибо

6 ответов

С Restlet 2 вы можете:

  • проверить совместимость медиа-типа объекта в @Post acceptRepresentation(Representation entity):

    @Post
    public Representation acceptRepresentation(Representation entity)
            throws ResourceException {
        if (entity.getMediaType().isCompatible(MediaType.APPLICATION_JSON)) {
           // ...
        }
        // ...
    }
    
  • или использовать @Post с одним или двумя параметрами:

    @Post("json") Representation acceptAndReturnJson(Representation entity) {
        // ...
    }
    

Смотрите эти ссылки:

(С помощью Restlet 1 вам необходимо проверить тип объекта.)

На момент написания этого ответа (через 2 года после вашего вопроса), Restlet 2.1 требует правильных зависимостей, выполненных для правильного использования и ответа JSON. Дело в том, кроме "Unsupported media type"Ответ, нет большого понятия о том, что происходит внутри.

Чтобы активировать тип мультимедиа JSON, необходимо включить зависимость от org.restlet.ext.jackson; если вам нужно поддерживать как XML, так и JSON, вам нужно включить Jackson FIRST, а затем org.restlet.ext.xstreamТак как XStream также способен к JSON-представлениям, но реализация довольно скудная (как описано в документах по рестлету, этот порядок рекомендуется авторами по рестлету).

Тогда вам на самом деле не нужно включать тип носителя в аннотацию, и вам просто нужно включить Content-Type заголовок в вашем запросе curl, то есть:

curl -X post -H "Content-Type: application/json" http://localhost:8080/login -d @login.json
  • где login.json содержит фактический запрос JSON.
  • логин @Post аннотированный метод принятия LoginRequest и отвечая LoginResponseс поддержкой форматов XML и JSON

Надеюсь, этот ответ кому-нибудь когда-нибудь поможет.:-)

Пример, на который ссылается Даниэль Вассалло, показывает данные, размещенные с использованием формы. Вот как отправить JSON:

@Post
public void acceptJsonRepresentation(JsonRepresentation entity) {

    JSONObject json = null;

    try {
        json = entity.getJsonObject();
        // business logic and persistence

    } catch (JSONException e) {
        setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
        return;
    } 

}

Чтобы проверить с помощью curl:

curl -X POST <your url> -H "Content-Type: application/json" -d '{"key" : "value"}'

Одинарные кавычки ('') вокруг данных в команде curl важны.

Вот некоторые обновления относительно этого старого вопроса. Restlet поддерживает сигнатуры методов, которые содержат bean-компоненты. В таких случаях Restlet будет использовать зарегистрированный конвертер, чтобы попытаться преобразовать / заполнить полученную полезную нагрузку в экземпляр компонента. Это также верно при отправке контента клиенту.

Вот пример метода, который обрабатывает запрос POST:

public class TestServerResource extends ServerResource {
    @Post
    public void test(TestBean bean) {
        System.out.println(">> bean = " + bean.getMessage());
    }
}

Бин может просто иметь следующую структуру:

public class TestBean {
    private String name;
    private String message;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Чтобы заставить работать такой механизм, вы можете просто добавить расширение Джексона (org.restlet.ext.jackson) в вашем классе. Соответствующий конвертер будет автоматически зарегистрирован под капотом.

Запрос curl прост, и данные для отправки должны быть указаны

curl -X POST http://... -H "Content-Type: application/json" -d '{"name" : "myname","description":"my description"}'

Надеюсь, это поможет тебе, Тьерри

Вот хороший и полный пример Restlet, который принимает JSON через POST:

И основное руководство о том, как тестировать веб-сервисы RESTful с помощью cURL:

curl -u uid:4c521655 -X POST -H "Content-Type: application/json" -d "type=Big&data="{\"name\":\"test\"}"" --dump-header headers 'http://localhost:8190/appli/add'
Другие вопросы по тегам