从 POSTMAN 到我的 java api 的 POST 上的 405 响应代码

Posted

技术标签:

【中文标题】从 POSTMAN 到我的 java api 的 POST 上的 405 响应代码【英文标题】:405 response code on POST to my java api from POSTMAN 【发布时间】:2019-01-30 20:42:12 【问题描述】:

我在 Eclipse 中创建了一个简单的 java restAPi 作为动态 Web 项目。我正在尝试从 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 错误?

感谢任何帮助。

【问题讨论】:

【参考方案1】:

HTTP 405 状态码表示该方法未经授权,但 url 本身存在并指向资源。如果您想使用 POST 方法访问您的端点,您将不得不创建另一个带有 @POST 注释的端点,在您的实际端点顶部添加 @POST 注释(不确定这个是否有效,永远不会到目前为止尝试过),或者只是将@GET更改为@POST

编辑

我认为您对 HTTP 的工作原理和原理存在一些误解。您正在发出 HTTP 请求。此请求可能有正文(GET 和 DELETE 方法没有正文)。可以在 Spring 中使用 @RequestBody SomePojoClass body 作为控制器方法的参数之一来收集主体。请看:https://baeldung.com/spring-request-response-body

【讨论】:

如果我将简单的更改 GET 更改为 POST,我能得到吗?? 不,不再是了,因此您可能会考虑同时使用这两个注释,但请注意 GET 请求没有 HTTP 主体,因此绝对不建议将相同的方法映射到 GET 和 POST,这个不尊重 RESTful API 协议,可能会导致进一步的问题... 这可能是一个模式问题,因此您可能应该重新考虑访问端点的方式。此外,GET 方法是从服务器端获取信息/对象而不改变它的状态,这就是你在这里所做的,所以我建议你只使用GET 方法 用 POST 代替 GET 或同时使用 POST 和 GET 和 POST 都不起作用。我做过这样的事情:@POST@Path("/json") @Produces(MediaType.APPLICATION_JSON)public Book postJson(@Context Book book) return book; .........但这并没有反映用邮递员的身体发的帖子……我知道我可以使用查询参数,但我想这样做……那怎么办? 您可能想在这里查看更多关于什么是 REST 的信息:***.com/questions/4663927/…【参考方案2】:

添加 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以上版本

【讨论】:

你使用 jersey-json jar 吗? 我正在使用 javax-json jar【参考方案3】:

HTTP 405 状态码表示Method Not Allowed。由于您有使用@GET 注释的方法,并且您正在尝试执行@POST,因此您将获得状态码。

因此,如果您想向同一端点发出 POST 请求,请删除 @GET 注释,因为您可以让一个方法一次只使用一个 HTTP 注释进行注释。

【讨论】:

以上是关于从 POSTMAN 到我的 java api 的 POST 上的 405 响应代码的主要内容,如果未能解决你的问题,请参考以下文章

从Postman中的嵌套响应中检索值

将 WordPress Rest API 请求限制到我的域

Laravel:如何通过 API postman 上传图像并将其保存到数据库(phpmyadmin)

“使用 POSTMAN 发布图像数据”

Flutter - 无法通过 http.get 从 api 获取数据

从 Postman 调用 Twitter API 有效,但从 Angular 2 应用程序调用却不行