#java #restlet
#java #restlet
Вопрос:
Я пытаюсь больше узнать о restlets, исходя из фона soap-rpc. Одна вещь, которую я, похоже, не могу понять, как это сделать (и, возможно, это невозможно), — это изменять объекты по запросам или отправлять обратно скопированную версию с изменениями.
Я пытаюсь сделать что-то вроде этого:
public interface AddressService {
@Get
Address addOnZipCode( Address address );
}
Сервер будет развернут вместе с реализацией, и клиент сможет использовать динамические прокси для выполнения своей работы.
Сервер запускается нормально, но когда клиент выполняет вызов, на сервере нет указания, что вызывается реализующий метод. Кроме того, клиент не выдает ошибку до тех пор, пока не вернется вызов на сервер — возвращенный объект равен null ?!?
Возможно ли то, что я пытаюсь здесь сделать, с помощью restlets? Если да, есть идеи о том, что я могу делать неправильно?
При необходимости я могу опубликовать больше кода.
Заранее спасибо.
ПРАВКА # 1:
Я даже пытался упростить его, чтобы не использовать пользовательские объекты:
@Post
String execute( String message );
Я получаю следующее:
INFO: Starting the default HTTP client
Exception in thread "main" Method Not Allowed (405) - Method Not Allowed
at org.restlet.resource.ClientResource$1.invoke(ClientResource.java:1615)
at $Proxy5.execute(Unknown Source)
Я начинаю думать, что это невозможно, поэтому мне трудно понять, насколько это жизнеспособная альтернатива веб-сервисам SOAP RPC.
ПРАВКА # 2: Похоже, что это возможно на основе примеров в книге: «Restlets в действии»
public interface AccountsResource {
@Get("txt")
public String represent();
@Post("txt")
public String add(String account);
}
ПРАВКА #3:
Оказывается, простое нажатие кнопки «Стоп» в моей консоли Eclipse не завершало работу экземпляра сервера. Открытие браузера по URL сервера показало некоторые сомнительные результаты — было запущено несколько старых экземпляров сервера. После того, как я закрыл их все, я заставил это работать. В конечном итоге ответ заключался в использовании @Post
вместо @Get1
.
Ответ №1:
Взгляните на это:
http://wiki.restlet.org/docs_2.0/13-restlet/21-restlet/318-restlet/303-restlet.html
На стороне сервера ваша реализация должна быть такой:
class AddressServerResource extends ServerResource implements AddressService {
// implementation
}
На стороне клиента:
ClientResource cr = new ClientResource("http://your-api.com/address/123");
AddressService service = cr.wrap(AddressService.class);
// use the service transparently
Редактировать:
@Post
Address addOnZipCode( Address address );
Комментарии:
1. Это то, что я сейчас делаю. К сожалению, ни один из примеров одновременно не принимает и не возвращает значение.
2. Аааа, вы не можете передать значение в
Get
методе. Это то, что явно не указано в документе, но я понял после того, как использовал Restlet в течение нескольких недель.3.
Get
Метод HTTP не допускает тело запроса. Тело запроса — это то, для чего RESTlet использует согласование содержимого, чтобы преобразовать его в объект Java. Вы можете передавать параметры только вPUT
иPOST
методах.4. Сейчас я получаю ошибку 405 — кажется, вы не можете использовать аннотации и делать это, по крайней мере, в соответствии с этим [ manning-sandbox.com/message.jspa?messageID=106811 ]
5. Или, может быть, вы можете, я не уверен, как.