这是一个很好的REST URI吗?

时间:2011-10-03 13:33:33

标签: c# wcf rest uri

以下URI是否在REST中有用?或者如何改进?

这是服务定义:(REST和SOAP - WCF)

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "/Services?CostCentreNo={CostCentreNo}&Filter={Filter}")]
    List<Services> GetServices(Int32 CostCentreNo, Int32 Filter);

这将给出一个示例URI:

    http://paul-hp:1337/WCF.IService.svc/rest/Services?CostCentreNo=1&Filter=1

我有很多get方法。 和一些插入方法。 URI是否可接受。是否需要GET/或其他内容?

修改 好的,现在我更加注意:  所以,如果我有一个子服务,它(可能)

    /CostCenters/{CostCentreNo}/Services/{ServiceID}/SubService 

并且,插入房间预订(超过20个参数)可以

   /CostCentres/{CostCentreNo}/Rooms/{RoomNo}/Booking?param1={param1}....&param20=‌​{param20}  

1 个答案:

答案 0 :(得分:2)

嗯...人们使用REST的原因之一是避免查询字符串中的任何其他而不是实际查询。在您的情况下,CostCentre可能应该拥有自己的URL,以及其服务的单独URL。根据您的示例,在我看来,只有Filter应该是一个查询字符串。

我会按如下方式构建您的网址:

/CostCenters/{CostCentreNo}/Services?Filter={Filter}

修改

  

好的,现在我更加注意:所以如果我有一个子服务,它   会(可能)

/CostCenters/{CostCentreNo}/Services/{ServiceID}/SubService  and,
     

插入房间预订(超过20个参数)可能

/CostCentres/{CostCentreNo}/Rooms/{RoomNo}/Booking?param1={param1}....&param20=‌​{param20}

如果可能的话,我建议授予可以存在于更靠近父层次结构的自己的URL上的各个实体。显然我不知道你的系统,但我的猜测是你可能想要做一些事情:

/CostCenters/{CostCenterNo}
/Services/{ServiceID}
/Rooms/{RoomNo}

仅使用

等层次结构
/CostCenters/{CostCentreNo}/Services/{ServiceID}/

如果没有CostCenter,服务就不能存在。如果是这种情况,请务必使用这样的层次结构。如果服务可以在没有CostCenter的情况下存在,请使用上面的前一个层次结构。

最后一件事。您的示例中的此网址:

/CostCenters/{CostCentreNo}/Services/{ServiceID}/SubService 

仅在服务可以只有一个SubService时才有意义。我打赌你的例子需要一个SubServiceID或类似的东西。按照上面的建议,我肯定会说SubService绝对需要扩展服务URL,例如:

/Services/{ServiceID}/SubServices/{SubServiceID}

在上面的例子中,我希望SubServiceID引用与ServiceID相同的实体池,并且该URL返回的任何数据或视图都包括Service和SubService。