数据格式的REST API端点命名

时间:2019-02-18 02:21:49

标签: rest api api-design

请问大家在使用不同数据格式时如何命名REST api端点。

API示例

  • / api / applications-获取所有应用程序的列表
  • / api / applications / {applicationId}-获取特定的应用程序详细信息
  • / api / applications / {applicationId} / topics-获取特定应用程序的所有主题

问题

使用中的应用程序夫妇可能希望以不同的格式传递数据-例如列表,树和可能不同的详细程度/详细程度。 RESTful API中最好的表示方式是什么?

可能的解决方案

不同的端点名称。不喜欢这样做,因为它感觉很脏,混合了端点和数据类型:

  • / api / applications / {applicationId} / topics
  • / api / applications / {applicationId} / detailedTopics
  • / api / applications / {applicationId} / topicHierarchy

子路径。不喜欢这样做,因为它似乎违反了RESTful命名约定。我希望/ topics / {topicId}:

  • / api / applications / {applicationId} / topics / details
  • / api / applications / {applicationId} / topics / list
  • / api / applications / {applicationId} / topics / hierarchy

查询字符串。这似乎是最好的解决方案,但我仍然不是100%满意:

  • / api / applications / {applicationId} / topics?detail = overview
  • / api / applications / {applicationId} / topics?format = list
  • / api / applications / {applicationId} / topics?format = tree

很想听听您的一些想法!谢谢!

2 个答案:

答案 0 :(得分:2)

如果不同的“格式”具有根本不同的数据,那么我个人将具有不同的端点。

如果“格式”表示相同的数据,但其组织方式不同,则解决此问题的标准方法是通过accept标头。

例如,如果您有一个/topics端点,它支持csv格式和两种类型的json格式,我将使用:

Accept: text/csv
Accept: application/vnd.ross.list+json
Accept: application/vnd.ross.hierarchy+json

答案 1 :(得分:1)

很多都是个人喜好,对您有用。您不一定要问这个问题,但就我个人而言,我更喜欢单个端点,因为与列表相比,您更可能拥有一个与单个实体打交道的端点。

  • GET:/ api / applications-应用程序列表
  • 获取:/ api / applications / {id}-获取单个应用程序
  • POST:/ api / applications-创建单个应用程序
  • 输入:/ api / applications-编辑单个应用程序
  • 补丁:/ api / applications-编辑单个应用程序
  • 删除:/ api / applications-删除单个应用程序

就主题而言,我将其移至其自己的端点

  • GET:/ api / topics?application = {applicationId}-特定应用程序的主题列表

这可以使端点变小,并允许您打开以添加其他参数。

我不确定整个细节和格式参数是关于什么的,但是如果格式是指内容类型,则可以将其作为查询参数(如文件扩展名)输入,也可以在请求标头。

  • / api / appications / {id} .json
  • / api / appications / {id}?format = json
  • / api / appications / {id},请求标头中带有//This is the code where the user is writing and it saves to localStorage. //Html page 1 that saves the variables var TankaKostnadVar = document.getElementById("tankaKostnad").value; var TankaLiterVar = document.getElementById("tankaLiter").value; var TankaDatumVar = document.getElementById("tankaDatum").value; localStorage.setItem("StorageKostnadVar", JSON.stringify( [TankaKostnadVar] )); localStorage.setItem("StorageLiterVar", JSON.stringify( [TankaLiterVar] )); localStorage.setItem("StorageDatumVar", JSON.stringify( [TankaDatumVar] )); //This is html page 2 (gets the items from localhost) var TankaKostnadVar = localStorage.getItem("StorageKostnadVar"); var TankaLiterVar = localStorage.getItem("StorageLiterVar"); var TankaDatumVar = localStorage.getItem("StorageDatumVar"); var arrayKostnad = JSON.parse(TankaKostnadVar); var arrayLiter = JSON.parse(TankaLiterVar); var arrayDatum = JSON.parse(TankaDatumVar); // Now you have arrays with data, but I don't know what you want to do with them... // you could add more values like this (still page 2)... arrayKostnad.push('new value 1') arrayLiter.push('new value 2') arrayDatum.push('new value 3') localStorage.setItem("StorageKostnadVar", JSON.stringify( arrayKostnad )); localStorage.setItem("StorageLiterVar", JSON.stringify( arrayLiter )); localStorage.setItem("StorageDatumVar", JSON.stringify( arrayDatum )); // now check the values again var TankaKostnadArr = JSON.parse(localStorage.getItem("StorageKostnadVar")); var TankaLiterArr = JSON.parse(localStorage.getItem("StorageLiterVar")); var TankaDatumArr = JSON.parse(localStorage.getItem("StorageDatumVar")); document.write(TankaKostnadArr, TankaLiterArr, TankaDatumArr)