2013-11-14 3 views
0

Обычно, чтобы получить ресурс один использует:Использование HTTP URI, как идентификаторы ресурсов в RESTful веб-API

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

Но что, если ваши идентификаторы элементов все HTTP URIs ?:

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 - Плохой запрос.

Есть ли наилучшая практика для этого?


Edit:

Тогда, конечно, если бы мы должны иметь (я не в данный момент) запроса в виде:

ресурсов/ID/коллекции/ID

и все идентификаторы являются HTTP-URI, все выходит из-под контроля ... Возможно, один могли бы сделать что-то вроде этого и разобрать содержимое внутри фигурных скобок:

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

+0

Я предполагаю, что идентификаторы URI другой системы являются достаточно стабильными для использования и не могут быть изменены из-под тебя? –

+0

Привет, Они столь же устойчивы, как и любой другой уникальный (числовой) идентификатор. –

ответ

0

Encode URI другой системы, а затем передать значение в качестве параметра запроса:

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

Уродливый взгляд, но никто не сказал, что URI, используемые в архитектуре REST, должны быть красивыми. :)

К слову, 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), по-видимому
, поскольку они не могут отличить данные запроса от данных маршрута, когда ищет иерархические разделители , Однако, поскольку компонентами запроса являются , которые часто используются для переноса идентифицирующей информации в виде пар «ключ = значение» , а одно часто используемое значение является ссылкой на другой URI, то иногда лучше для удобства использования, чтобы избежать процентного кодирования этих персонажи.

Так что вы можете легально сделать это:

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

Скорее всего, мне придется закончить работу, но это не совсем «неустойчиво» - не то, что я вообще не против. Посмотрим, будут ли какие-либо другие предложения. –

+1

Какое ограничение REST это нарушение, что не делает этот RESTful? –

Смежные вопросы