java - 带有 JSON : PUT and DELETE not working 的 RESTful Web 服务

标签 java json web-services rest

我正在尝试在 Netbeans 上设置一个简单的 RESTful Web 服务。基本上,我有一个容器,其中的组件是具有 3 个属性的简单订单对象:id、total 和项目列表。 容器上的 GET 和 POST 以及组件上的 GET 都可以正常工作。不起作用的是组件上的 PUT 和 DELETE:我没有收到任何错误,只是什么也没有发生。 由于 GET 正在工作,错误可能出在客户端,因此我在这里发布负责单个订单的客户端类。

package restclientjson;

    import javax.ws.rs.ClientErrorException;
    import javax.ws.rs.client.Client;
    import javax.ws.rs.client.WebTarget;


    public class JSONOrderClient {

        private WebTarget webTarget;
        private Client client;
        private static final String BASE_URI = "http://localhost:8080/RESTServerJSON/webresources";

        public JSONOrderClient(String id) {
            client = javax.ws.rs.client.ClientBuilder.newClient();
            String resourcePath = java.text.MessageFormat.format("orders/{0}", new Object[]{id});
            webTarget = client.target(BASE_URI).path(resourcePath);
        }

        public void setResourcePath(String id) {
            String resourcePath = java.text.MessageFormat.format("orders/{0}", new Object[]{id});
            webTarget = client.target(BASE_URI).path(resourcePath);
        }

        public void putJson(Object requestEntity) throws ClientErrorException {
            webTarget.request(javax.ws.rs.core.MediaType.TEXT_PLAIN).put(javax.ws.rs.client.Entity.entity(requestEntity, javax.ws.rs.core.MediaType.APPLICATION_JSON));
        }

        public void delete() throws ClientErrorException {
            webTarget.request().delete();
        }

        public <T> T getJson(Class<T> responseType) throws ClientErrorException {
            WebTarget resource = webTarget;
            return resource.request(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
        }

        public void close() {
            client.close();
        }

    }

编辑:这是服务器端代码:

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ServiceCore;

import dto.Order;
import java.util.Map;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.DELETE;
import javax.ws.rs.core.MediaType;

/**
 * REST Web Service OrderResource
 *
 * 
 */
public class OrderResource {

    private String id;
    private Map<String,Order> orderMap;

    /**
     * Creates a new instance of OrderResource
     */
    private OrderResource(String id,Map<String,Order> orderMap) {
        this.id = id;
        this.orderMap = orderMap;
    }

    /**
     * Get instance of the OrderResource
     */
    public static OrderResource getInstance(String id,Map<String,Order> orderMap) {
        // The user may use some kind of persistence mechanism
        // to store and restore instances of OrderResource class.
        return new OrderResource(id,orderMap);
    }

    /**
     * Retrieves representation of an instance of ServiceCore.OrderResource
     * @return an instance of dto.Order
     */
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Order getJson() {
        return orderMap.get(id);
    }

    /**
     * PUT method for updating or creating an instance of OrderResource
     * @param content representation for the resource
     */
    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public void putJson(Order content) {
        orderMap.put(id, content);
    }

    /**
     * DELETE method for resource OrderResource
     */
    @DELETE
    public void delete() {
        orderMap.remove(id);
    }
}



package ServiceCore;

import dto.Order;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

    /**
     * REST Web Service
     *
     */
    @Path("/orders")
    public class OrdersResource {

        @Context
        private UriInfo context;

        private static Map<String, Order> orderMap= new HashMap<String,Order>();
        {
            orderMap.put("1", new Order(1,2,new String[]{"water","coffee"}));
            orderMap.put("2", new Order(3,400,new String[]{"milk"}));
        }
        private static int id = 3;

        /**
         * Creates a new instance of OrdersResource
         */
        public OrdersResource() {
        }

        /**
         * Retrieves representation of an instance of ServiceCore.OrdersResource
         * @return an instance of dto.Order[]
         */
        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public dto.Order[] getJson() {


            Order[] orders = new Order[orderMap.size()];
            for(int i=0; i<orderMap.size(); i++){
                orders[i]=orderMap.get((i+1)+"");
            }

            return orders;
        }

        /**
         * POST method for creating an instance of OrderResource
         * @param content representation for the new resource
         * @return an HTTP response with content of the created resource
         */
        @POST
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
        public Response postJson(Order content) {
            orderMap.put(id+"", content);
            id++;
            return Response.created(context.getAbsolutePath()).build();
        }

        /**
         * Sub-resource locator method for {id}
         */
        @Path("{id}")
        public OrderResource getOrderResource(@PathParam("id") String id) {
            return OrderResource.getInstance(id,orderMap);
        }
    }

最佳答案

在 Java 中,大多数 Web 框架使用多个 Servlet 来处理请求,通常会在请求处理完毕后立即丢弃该 Servlet。

您可能需要将项目映射放入不同的上下文中,例如应用程序上下文,它在应用程序的整个生命周期中都是持久的。

关于java - 带有 JSON : PUT and DELETE not working 的 RESTful Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668579/

相关文章:

java - 使用 Java 在字符串中的数字周围插入星号

java - 多对一关系的复合主键不支持映射报错

Javascript 代码仅在调试时运行

php - 取消设置数组中的索引将它变成一个对象

java - JAXB 解码,同一对象 - 多个实例

php - 使用json_encode显示select查询的内容时,如何命名对象?

c# - 数据契约WCF放在哪里?可以放入数据层吗?

java - Web 服务客户端 - 静态与动态

java - 在 Spring 3.1 mvc webservice 中设置响应的内容类型

java - 如何让我的聊天程序随着聊天的进行而向下滚动?