从 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 响应代码的主要内容,如果未能解决你的问题,请参考以下文章
Laravel:如何通过 API postman 上传图像并将其保存到数据库(phpmyadmin)