405 кода ответа на POST для моего java api от POSTMAN

Eswar спросил: 31 июля 2018 в 09:32 в: java

Я создал простой java restAPi в eclipse как динамический веб-проект. Я пытаюсь отправить POST из POSTMAN в ту же конечную точку (что я делаю GET), но я получаю код ответа 405.

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JsonJavaApi</display-name><servlet>
  <servlet-name>Book API</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>test</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
   <servlet-name>Book API</servlet-name>
   <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>

Класс книги:

public class Book {public String author;
public String name;public Book(String author, String name) {
    super();
    this.author=author;
    this.name=name;
}
public String getAuthor() {
return author;
}public void setAuthor(String author) {
this.author = author;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public Book() {
    super();
}}

Код restapi:

@Path("/jason")
public class JavajsonRestApi {
@GET
@Path("/json")
@Produces(MediaType.APPLICATION_JSON)
public Book getJson() {    Book book = new Book();
    book.setAuthor("eswar");
    book.setName("eswar");
    return book;
}
}

Конечная точка:

http:// localhost: 8080 / JsonJavaApi / rest / jason / json

Как я понимаю, разрешение на публикацию не предоставляется этой конечной точке, но как мне это сделать так что клиентская сторона может отправлять сообщения из самого тела, это помогает избавиться от ошибки 405?

Любая помощь приветствуется.

3 ответа

Есть решение
Louis-Wht ответил: 31 июля 2018 в 10:03

HTTP 405 Коды состояния означают, что метод не авторизован, но сам URL-адрес существует и указывает на ресурс. Если вы хотите получить доступ к вашей конечной точке с помощью метода POST, вам нужно будет либо создать другую конечную точку с аннотацией @POST поверх нее, добавить аннотацию @POST сверху вашей фактической конечной точки (не уверен, что это работает, никогда не пробовал до сих пор), или просто измените @GET на @POST.

EDIT

Я думаю, у вас есть некоторое недопонимание того, что и как работает HTTP. Вы делаете HTTP-запрос. Этот запрос может иметь тело (методы GET и DELETE не имеют тела). Тело может быть собрано в Spring с использованием @RequestBody SomePojoClass body в качестве одного из параметров вашего метода контроллера. Пожалуйста, смотрите: https://baeldung.com/spring-request-response-body

Eswar ответил: 31 июля 2018 в 09:36
если я изменю простое изменение GET на POST, смогу ли я получить ??
Louis-Wht ответил: 31 июля 2018 в 09:37
Нет, больше нет, так что вы можете посмотреть на наличие обеих аннотаций, но будьте осторожны, чтобы у запросов GET не было тела HTTP, поэтому сопоставление одного и того же метода с GET и POST абсолютно не рекомендуется, это не касается протокола RESTful API и может привести к дальнейшим проблемам ...
Louis-Wht ответил: 31 июля 2018 в 09:39
Вероятно, это проблема шаблона, поэтому вам следует переосмыслить способ доступа к конечной точке. Более того, метод GET - это получение информации / объектов со стороны сервера без изменения его состояния, что вы и делаете здесь, поэтому я рекомендую вам использовать только метод GET
Eswar ответил: 31 июля 2018 в 09:41
Замена GET на POST или использование вместе POST и GET и POST вместе не работает. Я сделал так: @ POST @ Path ("/ json") @Produces (MediaType.APPLICATION_JSON) публичная книга postJson (@Context Book book) {вернуть книгу;} ......... Но это не отражает сообщение сделано из тела почтальона ... Я знаю, что могу использовать параметры запроса, но я хочу сделать это таким образом .... Так как?
Louis-Wht ответил: 31 июля 2018 в 09:42
Возможно, вы захотите посмотреть дополнительную информацию о том, что такое REST, здесь: stackoverflow.com/questions/4663927/…
Raja Ramachandran ответил: 31 июля 2018 в 09:41

Добавить web.xml

   <servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer    
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.sample.rest</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

и обновить версию Джерси 1.8 выше

Eswar ответил: 31 июля 2018 в 09:55
Я использую майку версии 2.25, ... это не работает
Raja Ramachandran ответил: 31 июля 2018 в 09:58
Вы используете Джерси-JSON JAR?
Eswar ответил: 31 июля 2018 в 10:26
Я использую javax-json jar
Yug Singh ответил: 31 июля 2018 в 09:52

HTTP 405 код состояния означает Method Not Allowed. Поскольку у вас есть метод, помеченный @GET, и вы пытаетесь выполнить @POST, значит, вы получаете код состояния.

Так что если вы хотите сделать Запрос POST к той же конечной точке, а затем удалите аннотацию @GET, так как вы можете иметь метод, аннотированный только одной аннотацией HTTP за раз.