Рестлет 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) { // ... }
Смотрите эти ссылки:
- http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2585586
- http://www.restlet.org/documentation/2.0/jse/api/org/restlet/resource/Post.html
(С помощью 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'