Я знаю, что нелегко передать что-то на сервер REST (Resource), который не является ни строкой, ни простым типом.
Но для простого процесса заказа мне нужно отправить список статей (которые должны быть заказаны) от клиента к серверу.Ошибка 405 «Метод не разрешен» с использованием POST с @FormParam (веб-сервис Java с Джерси REST)
Я уже пробовал использовать «QueryParam», преобразовывая свой объект (я завернул список в DTO) в JSON-String и передал его. Это не сработало. (Но для других методов, которые не должны передавать объект на сервер, мой сервис работает отлично, даже POST-методы.)
Затем я узнал о @FormParam, который теоретически может передавать все виды объектов. (Это то, что я читал, это правда?)
Итак, я попробовал в очень простом методе тестирования передать список строк службе, серверный сервер должен вернуть количество элементов этого списка.
Вот мой код:
На стороне сервера (ресурса):
@Path("bestellung")
public class BestellungResource {
@Path("test")
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(XML)
public Integer test(
@FormParam("list") List<String> list){
return list.size();
}
}
А на стороне клиента (в Bean Session):
public Integer test() {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Form form = new Form();
form.add("list", list);
return service
.path("bestellung")
.path("test")
.type(MediaType.APPLICATION_FORM_URLENCODED)
.post(Integer.class, form);
}
Где сервис построен так:
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
service = client.resource(UriBuilder.fromUri("<service url>").build());
Вызов этого клиентского метода из моего графического интерфейса или непосредственно через EJB Explorer всегда дает ошибку 405.
В чем проблема? Я что-то пропустил с помощью POST, MIME-типов или формы?
Кстати, даже с простыми параметрами формы, такими как String или int, это не работает и выдает ошибку 405.
Благодарим за помощь!
Jana
Ehm, '@Path (" test ")' и 'service.path (" bestellung ") ...' - это опечатка или, возможно, ваша проблема? –
Привет Андерс, нет, это ни опечатка, ни неправильность ... Я забыл добавить, что мой класс сервиса (ресурса) аннотируется @Path («bestellung»). Поэтому я должен добавить оба пути URL. Сначала «bestellung», затем «тест». Я добавлю это в сообщение! – Jana
Я не получаю 405, используя ваш код в своей среде. Поэтому дважды проверьте несколько вещей: 1) вы на самом деле запрашиваете, что вы думаете (включите ведение журнала с помощью 'resource.setFilter (новый LoggingFilter (System.out))' для просмотра исходящего запроса), 2) вы не есть другой метод с тем же путем, и 3) у вас нет фильтра, который меняет ваш запрос где-то. Кстати, 'list' на стороне сервера будет содержать список параметров формы. В вашем случае он будет содержать 1 элемент, строковое представление списка, созданного вами на клиенте '' [1, 2, 3] «' не сам список. – DannyMo