REST:如何构建以参数作为第一个标记的请求路径?

REST: How do I build a request path with a parameter as first token?

我是 RESTful 服务的新手。我通常在 JBoss / Wildfly 环境中开发 Java EE 应用程序和 SOAP 服务。我目前正在尝试进入 RESTful 服务领域以拓宽我的知识面。因为我对 JBoss / Wildfly 很熟悉,所以我决定使用 RESTEasy。

我决定为宠物连锁店示例创建一个 RESTful 服务。作为一家连锁店,宠物店有多家商店,这些商店由商店 ID 标识(例如商店 1、商店 2 等)。我创建了多个 REST 服务以根据技术功能对服务进行细分(例如文章服务 => article.war、订单服务 => orde.war 等

我想创建人类可读的 URL,例如:
获取:
http://mypetshop.example/rest/{shopId}/article/{articleId}

POST with JSON 格式化订单内容:
http://mypetshop.example/rest/{店铺编号}/order/create

到目前为止,我只能创建如下 URL:
获取:
http://mypetshop.example/rest/article/{shopId}/{articleId}

POST with JSON 格式化订单内容:
http://mypetshop.example/rest/order/create/{店铺编号}

我想要的 REST 路径是否可行,还是我必须跟上当前的解决方案?

此致, CB

这是文章服务的示例代码:

ArticleRestApplication.java:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath(ArticleRestApplication.ROOT_PATH)
public class OrderRestApplication extends Application {
    public static final String ROOT_PATH = "/article";
}

ArticleService.java

public interface ArticleService{
    Article getArticle(String shopId, Integer articleId);
}

ArticleServiceImpl.java:

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.google.gson.Gson;

@Path("/")
@Consumes(MediaType.APPLICATION_JSON + ";charset=UTF-8")
@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public class ArticleServiceImpl implements ArticleService {
    public ArticleServiceImpl() {
        super();
    }

    @GET
    @Path("/{shopId}/{articleId}")
    public Article getArtikel(
      @PathParam("shopId") String shopId,
      @PathParam("articleId") Integer articleId) {
        System.out.println(String.format("Shop ID: \"%s\"", shopId));
        System.out.println(String.format("Article ID: \"%s\"", articleId));
        return gson.toJson(new Article(articleId));
    }
}

Article.java:

import java.io.Serializable;
import java.math.BigDecimal;

import javax.xml.bind.annotation.XmlRootElement;

@SuppressWarnings("serial")
@XmlRootElement(name = "article")
public class Article implements Serializable {
    private String shopId;
    private int articleId;
    private String name = "Super pet food";
    private BigDecimal price = new BigDecimal("1.00");
    private int unitsInStock = 1000;

    public Article(String shopId, int articleId) {
        super();
        this.shopId = shopId;
        this.articleId = articleId;
    }
}

是的,你可以做到
如下图

rest/orders/1/completed

这里rest在rest servlet path中,命令为class,然后使用@Path("{orderId}/completed")

 @Path("orders")
public class OrderService {

    @GET
    @Path("{orderId}/completed")
    public String getOrders(@PathParam("orderId") String orderId) {
        return "orderId: " + orderId;
    }

    @GET
    @Path("summary")
    public String getOrdersSummary() {
        return "orders summary";
    }
}

http://jerseyexample-ravikant.rhcloud.com/rest/orders/1/completed

现场演示