RESTful Web应用程序URL / URI

时间:2016-07-04 17:44:39

标签: java web-services rest jaxb

我有以下资源(仅显示相关方法):

@Path("myresource")
public class MyResource {

GroupContainer groups= new GroupContainer(); //holds groups in an arrayList

@GET
@Produces(MediaType.TEXT_HTML)
public String start() {


    StringBuilder htmlBuilder = new StringBuilder();
    htmlBuilder.append("<html>");
    htmlBuilder.append("<body>");
    htmlBuilder.append("<h1>Hello</h1>");


    htmlBuilder.append("<p>Following: groups</p> <br>");
    for(Group g: groups.getGroups()){
        htmlBuilder.append("<p>" + (g.getID() + " | " + g.getName()) + "</p>");

        htmlBuilder.append("<form method='GET' action='myresource/" + g.getID() +"'>"); 
        htmlBuilder.append("<input type='submit' value='view this group'/>");
        htmlBuilder.append("</form>");

        htmlBuilder.append("<form method='DELETE' action='group'>");
        htmlBuilder.append("<input type='submit' value='delete this group'/>");
        htmlBuilder.append("</form>");
    }

    htmlBuilder.append("<a href='http://localhost:8080/myapp/myresource/asXML'>show overwiev as XML</a>");


    htmlBuilder.append("</body>");

    return htmlBuilder.toString();

}


@Path("/{groupid}") 
public GroupResource getGroupByID(@PathParam("groupid") long groupid){

    Group g=null;
    for(int i=0;i!=groups.getGroups().size();++i){
        if(groups.getGroups().get(i).getID()==groupid){
            g= groups.getGroups().get(i);
            break;
        }
    }

    GroupResource grRes= null;
    if(g!=null){
        grRes= new GroupResource(g);
    }

    System.out.println(g.getID());

    return grRes;
}

}

和groupResource看起来像这样:

@Path("group")
public class GroupResource {


public Group group; 

public GroupResource(Group group){
    this.group= group;
}

@GET
@Produces(MediaType.TEXT_HTML)
public String listGroups(){


    StringBuilder htmlBuilder = new StringBuilder();
    htmlBuilder.append("<html>");
    htmlBuilder.append("<body>");
    htmlBuilder.append("<h1>Displaying Group</h1>");

    for(Person g: group.getMembers()){
        htmlBuilder.append("<p>" + (g.getID() + " | " + g.getName()) + "</p>");
        htmlBuilder.append("<p>" + g.getDescription() + "</p>");

        htmlBuilder.append("<form method='GET' action='group/asXML'>");
        htmlBuilder.append("<input type='submit' value='view this Member'/>");
        htmlBuilder.append("</form>");

        htmlBuilder.append("<form method='DELETE' action='group'>");
        htmlBuilder.append("<input type='submit' value='delete this member'/>");
        htmlBuilder.append("</form>");

        htmlBuilder.append("<form method='UPDATE' action='group'>");
        htmlBuilder.append("<input type='submit' value='delete this member'/>");
        htmlBuilder.append("</form>");
    }


            /*htmlBuilder.append("<p>Following: groups</p> <br>");
            for(Group g: groups){
                htmlBuilder.append("<p>" + (g.getID() + " | " + g.getName()) + "</p>");
            }*/

    htmlBuilder.append("</form>");
    htmlBuilder.append("</body>"); 

    return htmlBuilder.toString();

}

}

当致电http://localhost:8080/myapp/myresource时,我得到了一个(非xml)对我已经创建的群组的覆盖,并为下面的每个群组添加了一个按钮。 现在我想看一个小组:

点击表单按钮htmlBuilder.append("<form method='GET' action='myresource/" + g.getID() +"'>");

我得到了我想要的东西:组的GET方法叫做
@GET @Produces(MediaType.TEXT_HTML) public String listGroups(){...}我得到该组中每个成员的重复(组类有一个成员的arraylist,显示)

唯一的问题是,我不知何故仍在myresource网址

当我查看浏览器的地址栏时,会显示:

http://localhost:8080/myapp/myresource/3(如果我们点击ID == 3的群组)
我希望它像http://localhost:8080/myapp/group/3

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您的方法MyResource#getGroupByID实际上是一个子资源定位器。

Subresource Locator是Resource类中使用@Path注释的方法,没有@GET@POST等资源方法指示符。如果请求URL的路径采用&#34; myresource/{groupid}&#34;的模式,则将匹配并调用根资源和子资源定位器,并返回GroupResource的实例处理HTTP请求。这就是您在发送网址为GroupResource#listGroups的请求时从/myresource/3获得HTML回复的原因。请注意,GroupResource作为子资源类不需要使用@Path进行批注。有关详细信息,请参阅Subresources and Runtime Resource Resolution

如果您希望/group/3返回HTML响应,则不需要子资源定位器。相反,您需要使用GroupResource注释的@Path("group")的根资源和内部带有@Path("/{groupid}")的子资源方法。您可以尝试以下内容:

1。 将您的所有逻辑从MyResource#getGroupByID移至GroupResource#listGroups并更新listGroups,如下所示:

@GET
@Path("/{groupid}") 
@Produces(MediaType.TEXT_HTML)
public String listGroups(@PathParam("groupid") long groupid) {
    // logic from MyResource#getGroupByID

    StringBuilder htmlBuilder = new StringBuilder();
    htmlBuilder.append("<html>");

    ...
}

2。 更新MyResource#start以向HTML提供group而不是myresource的表单操作:

htmlBuilder.append("<form method='GET' action='group/" + g.getID() +"'>"); 

这将导致GET /group/{groupid}发送到GroupResource#listGroups方法的HTTP请求。