2016-07-09 1 views
-2

Я пишу веб-службу RESTful. технологии, которые я использую:Как включить/отключить методы HTTP для веб-службы RESTful?

  • Eclipse, Е.Е. Кеплер IDE
  • GlassFish 3 (на основе Java 6)
  • Джерси
  • JDK v7

Когда я аннотировать метод Java с, например, аннотация @DELETE Я получаю следующую ошибку HTTP (вызывается через URI):

HTTP Status 405 - Method Not Allowed 

Я хотел бы знать , как включить/отключить (таким образом, чтобы включить/отключить вышеуказанную ошибку HTTP) эти методы (PUT, HEAD и т.д.) и на каком уровне это может быть сделано (GlassFish, Web.xml и т. Д.). Кроме того, вы можете вызывать все эти методы ресурсов (аннотированные с типом метода HTTP) из URI веб-браузера, в пределах <form> или автономного клиентского приложения (не-браузер)?

Например, независимо от того, присутствует или нет следующей конфигурации линии на дескрипторе развертывания, это не имеет никакого значения:

<security-constraint> 
<web-resource-collection> 
    <web-resource-name>RESTfulServiceDrill</web-resource-name> 
    <url-pattern>/drill/rest/resource/*</url-pattern> 
    <http-method>DELETE</http-method> 
</web-resource-collection> 

Конечно, один может отключить конкретный метод ресурсов пути бросать исключение от него (и сопоставить его с ошибкой HTTP) как указание на него. Это означает, что реализация не доступна, например.

До сих пор работали только методы @GET и @POST (по <form>), другие аннотированные методы, такие как @POST (через URI), @PUT, @DELETE, @OPTIONS, возвращают указанную выше HTTP-ошибку , И здесь мой вопрос нуждается в решениях. Почему упомянутые методы ресурсов вызывают ошибку HTTP, когда первые два нет?

Пример метода ресурса:

@DELETE 
@Consumes(MediaType.TEXT_PLAIN) 
@Produces(MediaType.TEXT_PLAIN) 
@Path("/getDelete/{value}/{cat}") 
public String getDelete(@PathParam("value") String value, @PathParam("cat") String cat){ 
    return value+" : "+cat; 
} 

Вызов URL:

<a href= "/RESTfulServiceDrill/rest/v6/exception/getDelete/Animal/cat">getDelete</a> 

Дескриптор развертывания пуст, для указанных выше строк кода XML, за исключением. До сих пор я заставил приложение работать, используя аннотации, не Web.xml (содержит только некоторые значения по умолчанию, например, файлы index.jsp).

Есть идеи?

+2

Я не совсем понимаю ваш вопрос. У вас есть проект в основном работает, т. Е. Работает ли какой-либо метод ваших классов REST? Если нет проблемы с вашей настройкой, если да, вы должны взять этот метод в качестве примера. Для получения дополнительной информации, пожалуйста, обновите вопрос с помощью вашего полного кода 'web.xml' и примера. – unwichtich

+0

Для меня ваш вопрос в целом не имеет большого смысла, поэтому я думаю, что причина для всех пустых голосов. –

+0

Не могли бы вы привести примеры того, что вы имеете в виду? Ваш вопрос довольно неясен. Вы указываете метод REST для соответствующего пути в Java, используя Джерси. Кроме того, вы определяете GET для этого пути, прежде чем определить DELETE? – Signus

ответ

3

В моем понимании, у вас есть REST API, разоблачены и вы пытаетесь получить к нему доступ из HTML <form> .Теперь вы можете получить доступ к GET и POST методы (REST API) из HTML <form> но не PUT, DELETE и другие методы HTTP ,

Причина, по которой вы получаете исключение Method Not Allowed при попытке доступа к методу DELETE или PUT или другим методам HTTP, HTML <form> не поддерживает методы, отличные от GET и POST.

Даже если вы пытаетесь

<form method="delete"> or <form method="put"> 

HTML не будут понимать эти методы и считают, что это просто <form> (то) метод формы по умолчанию GET. Итак, вы даже упоминали метод DELETE или PUT. Это запрос GET.

И когда звонок сделан, контейнер Джерси пытается найти путь запроса (здесь "/getDelete/{value}/{cat}") с указанным методом (здесь GET). Хотя этот путь существует, вы упомянули DELETE как приемлемый метод в своем ресурсе (аннотация @DELETE говорит так). Но Джерси ищет GET сейчас. Поскольку он не может найти @GET, он возвращает Method not allowed Исключение.

Итак, как его решить?

В HTML <form> вы не можете использовать HTTP-методы, отличные от GET и POST. Лучше иметь оболочку между слоем REST и HTML. Чтобы вы могли совершать POST-вызов из своего HTML-кода, обертка обрабатывает этот вызов и который по очереди вызывает уровень DELETE REST.

И, почему метод POST не работает из браузера, по умолчанию браузер выполняет вызов GET. Посмотрите на Postman, чтобы сделать REST-вызовы различными методами Http.

+0

Что такое оболочка, которая обрабатывает вызовы? Является ли это реализацией структуры Javascript или любого другого типа клиента, например, основанного на URL (в Java 6) или конкретной клиентской библиотеки на Java 7? В заключение, означает ли это, что вы можете только вызывать GET ('') и POST (только из методов '

') из браузера в качестве клиента, иначе для других методов вам нужно использовать другие реализации клиента? – ucas

+1

1) Лучше из HTML вызывать Servlet или JSP, который вызывает DELETE-вызов. 2) В html-форме вы можете использовать только GET и POST .. (метод формы может быть GET или Post) 3) Из браузера, такого как chrome, вы можете совершать только вызовы GET. – Jeevi

+0

Это все, что мне нужно, более или менее. К настоящему времени предоставленная информация является удовлетворительной. Может кто-то вытащить -1. – ucas

Смежные вопросы