Как реализовать функцию Restlet, которая принимает сообщение JSON? И как я могу проверить это с помощью curl?
Спасибо
Как реализовать функцию Restlet, которая принимает сообщение JSON? И как я могу проверить это с помощью curl?
Спасибо
С помощью 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 -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 поддерживает сигнатуры методов, содержащие 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
Вот хороший и полный пример 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'