2013-11-14 57 views
0

资源标识符通常检索资源的一个用途:使用HTTP的URI在REST风格的Web API

但是如果
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 

这将无法正常工作。

URI编码“http://id.someotherdomain.com/SGX.3211” - HTTP 400中的部分结果 - 错误的请求。

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


编辑:

然后当然,如果我们需要有(我不知道此刻的)请求的形式:

资源/ ID /收藏/ ID

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

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

+0

我假设其他系统的URI是足够稳定使用,不受距离下你改变? –

+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 

UPDATE:显然你不再有编码 “/” 和 “?”在查询组件内。从RFC 3986

字符斜线( “/”)和问号( “?”)可以表示数据的查询组件内 。请注意,某些较旧的错误的 实现可能无法正确处理此类数据,因为它在中用作相对引用的基URI(5.1节),显然是
,因为它们在查找分层分隔符时无法区分查询数据和路径数据。但是,由于查询组件通常用于以“key = value” 对的形式携带标识信息,而一个常用值是对另一个URI的引用,因此 有时更适合可用性,以避免百分比编码那些 字符。

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

GET /resource?ref=id.someotherdomain.com/SGX.3211 HTTP/1.1 
Host: ws.mydomain.com 
+0

这可能是我最终要做的事情,但它并不完全“重新调整” - 我根本不介意。让我们看看是否会有其他建议。 –

+1

这违反了什么REST约束不会使这个RESTful? –