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

时间:2017-01-30 08:50:24

标签: rest glassfish

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

“& quot; id& quot;:未在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();
}

}

在Postman中我写了这个:

{
"id" : 1,
"name" : "Adam"
}

enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

检查你的邮递员。您应该将其设置为下图。如果您的身体类型不是application/json,或者您的方法不是POST,那么您将获得方法不允许的错误。

Postman

要获取Postman生成的HTTP / CURL / ...调用,请按照此图像。

Generated Code

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

  

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

     

当您可以通过特定更新资源时使用PUT   资源。例如,如果您知道某篇文章所在的位置   http://example.org/article/1234,您可以投入新资源   直接通过此URL上的PUT表示本文。

     

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

答案 1 :(得分:0)

我认为问题不在您的邮递员中,而是在服务器端。 检查这篇文章,它为我解决了这个问题,最后我的配置看起来像这样(绿色部分是您唯一关心的地方)

ASP.NET Web API - PUT & DELETE Verbs Not Allowed - IIS 8

enter image description here

相关问题