Рестлет POST с использованием JSON - PullRequest
12 голосов
/ 09 января 2010

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

Спасибо

Ответы [ 6 ]

10 голосов
/ 25 июня 2010

С 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 вам нужно будет проверить тип сущности.)

8 голосов
/ 31 июля 2012

На момент написания этого ответа (через 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

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

6 голосов
/ 24 января 2011

Пример, на который ссылается Даниэль Вассалло, показывает данные, опубликованные с использованием формы. Вот как отправить 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.

3 голосов
/ 22 апреля 2015

Вот некоторые обновления относительно этого старого вопроса. 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"}'

Надеюсь, это поможет вам, Thierry

2 голосов
/ 09 января 2010

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

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

0 голосов
/ 22 мая 2014
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'
...