通常要检索使用的资源:
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...}
答案 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