使用HTTP URI作为RESTful Web API中的资源标识符

时间:2013-11-14 13:33:25

标签: web-services rest uri

通常要检索使用的资源:

GET http://ws.mydomain.com/resource/123212

但是如果你的商品ID是HTTP URI呢?

GET http://ws.mydomain.com/resource/http://id.someotherdomain.com/SGX.3211

浏览器用一个斜杠替换两个斜杠,请求变为:

GET http://ws.mydomain.com/resource/http:/id.someotherdomain.com/SGX.3211

哪个不起作用。

编码“http://id.someotherdomain.com/SGX.3211”-part的URI会导致HTTP 400 - 错误请求。

是否有处理此问题的最佳做法?


编辑:

当然,如果我们需要(我现在不要)请求表格:

  

资源/ ID /集合/ ID

并且所有ID都是HTTP URI,事情失控......可能有人可以做这样的事情并解析大括号内的内容:

  

resources/{http://id...}/collections/{http://id...}

1 个答案:

答案 0 :(得分:0)

对其他系统的URI进行编码,然后将该值作为查询参数传递:

GET http://ws.mydomain.com/resource?ref=http%3A%2F%2Fid.someotherdomain.com%2FSGX.3211
看起来很难看,但没有人说REST架构中使用的URI必须很漂亮。 :)

顺便说一句,GET在发送时实际上看起来像这样:

GET /resource?ref=http%3A%2F%2Fid.someotherdomain.com%2FSGX.3211 HTTP/1.1
Host: ws.mydomain.com

更新:显然您不再需要编码“/”和“?”在查询组件中。来自RFC 3986

  

字符斜杠(“/”)和问号(“?”)可能代表数据   在查询组件中。要小心一些年纪大了,错了   当实现它时,实现可能无法正确处理这些数据   相对引用的基URI(第5.1节),显然是
  因为他们无法区分查询数据和路径数据   寻找分层分隔符。但是,作为查询组件   通常用于以“key = value”的形式携带识别信息   对和一个经常使用的值是对另一个URI的引用,它   有时可以更好地避免使用百分比编码   字符。

所以你可以合法地做到这一点:

GET /resource?ref=id.someotherdomain.com/SGX.3211 HTTP/1.1
Host: ws.mydomain.com
相关问题