REST - HTTP 状态 405 - 不允许的方法

Luc*_*mer 1 rest glassfish

我尝试在我的网络项目上使用 REST。POST 有效,但 DELETE 和 PUT 不起作用,我会看到错误:HTTP 状态 405 - 不允许方法。并且 GET 根本不起作用:

“‘id’:RFC 2068 中未定义,且 Servlet API 不支持。描述:服务器不支持满足此请求所需的功能。”

这是我的代码:

package rest;

import domain.model.Client;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.ws.rs.*;
import javax.xml.bind.annotation.XmlRootElement;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import java.util.ArrayList;
import java.util.List;

@XmlRootElement
@Path("/clients")
@Stateless
public class ClientResources {

@PersistenceContext
EntityManager entityManager;

@GET
@Consumes(MediaType.APPLICATION_JSON)
public Response getAll() {
    List<Client> matchHistories = new ArrayList<>();
    for (Client m : entityManager
            .createNamedQuery("client.all", Client.class)
            .getResultList())
        matchHistories.add(m);


    return Response.ok(new GenericEntity<List<Client>>(matchHistories) {
    }).build();
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response Add(Client client) {

    entityManager.persist(client);
    return Response.ok(client.getId()).build();
}

@PUT
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
public Response update(@PathParam("id") int id, Client p) {
    Client result = entityManager.createNamedQuery("client.id",  Client.class)
            .setParameter("clientId", id)
            .getSingleResult();
    if (result == null) {
        return Response.status(404).build();
    }
    result.setName(p.getName());
    result.setSurname(p.getSurname());
    entityManager.persist(result);
    return Response.ok().build();
}

@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response get(@PathParam("id") int id) {
    Client result = entityManager.createNamedQuery("client.id", Client.class)
            .setParameter("clientId", id)
            .getSingleResult();
    if (result == null) {
        return Response.status(404).build();
    }
    return Response.ok(result).build();
}

@DELETE
@Path("/{id}")
public Response delete(@PathParam("id") int id) {
    Client result = entityManager.createNamedQuery("client.id", Client.class)
            .setParameter("clientId", id)
            .getSingleResult();
    if (result == null)
        return Response.status(404).build();
    entityManager.remove(result);
    return Response.ok().build();
}
Run Code Online (Sandbox Code Playgroud)

}

在《邮递员》中我这样写:

{
"id" : 1,
"name" : "Adam"
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在 此输入图像描述

500*_*ror 6

检查你的邮递员。您应该将其设置如下图所示。如果您的身体类型不是application/json或您的方法不是,POST您将收到“方法不允许”错误。

邮差

要获取由 Postman 生成的 HTTP/CURL/... 调用,请遵循此图片。

生成的代码

/clients/{id}正如迈克在评论中注意到的那样,您的 PUT 服务是从路径到达的。因此,您必须使用客户端的 ID 来调用它,PUT 才能正常工作。

HTTP 方法 POST 和 PUT 并不等同于 CRUD 的创建和更新的 HTTP。它们都有不同的目的。使用 PUT 来创建资源或使用 POST 来更新资源是很有可能的、有效的,甚至在某些情况下是首选的。

当您可以通过特定资源完全更新资源时,请使用 PUT。例如,如果您知道一篇文章位于 http://example.org/article/1234,您可以直接通过此 URL 上的 PUT 来 PUT 这篇文章的新资源表示形式。

如果您不知道实际的资源位置,例如,当您添加新文章时,但不知道将其存储在哪里,您可以将其 POST 到 URL,并让服务器决定实际的 URL。

  • @YanaGlance您仍在`/clients`端点上执行`PUT`,但是您没有使用`@PUT`定义任何方法来侦听该端点(您有一个用于`/clients/{id}`的方法) 。将邮递员中的“PUT”更改为“POST”。 (2认同)