Восстанавливать POST с помощью JSON

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

Спасибо

Ответ 1

С помощью 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

Как и в случае написания ответа (через 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 -X post -H "Content-Type: application/json" http://localhost:8080/login -d @login.json
  • где login.json содержит фактический запрос JSON.
  • login @Post аннотированный метод, принимающий LoginRequest и отвечающий с помощью LoginResponse, оба способные к форматам мультимедиа XML и JSON

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

Ответ 3

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

Ответ 4

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

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

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

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

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;
    }
}

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

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

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

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

Ответ 6

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'