RESTful API - как включить id / token / ... в каждый запрос? - PullRequest
0 голосов
/ 19 октября 2018

Я разработал мобильное приложение, которому требуется доступ и обновление данных на сервере.Я хотел бы включить, например, идентификатор устройства и некоторые токены в каждом запросе.

В настоящее время я включаю их в тело, поэтому у меня есть только запросы POST, даже когда я запрашиваю чтение данных с сервера,Тем не менее, запрос на чтение данных должен быть GET, но как мне включить эти фрагменты информации?Должен ли я просто добавить тело в запрос GET?Должен ли я добавить несколько заголовков?Если так, могу ли я просто создать какие-либо пользовательские заголовки с любым именем?Спасибо за ваше руководство.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Ваш токен FCM и идентификатор устройства действительно являются идентификационными данными для запроса.В HTTP вы обычно используете заголовок Authorization со схемой для указания службе

. В вашем случае вы можете использовать токены носителя в заголовке HTTP Authorization.Хотя токены-носители часто используются с токеном JWT, они не обязательно должны иметь этот конкретный формат.

Вы можете просто объединить токен FCM и идентификатор устройства, как это делает базовая схема аутентификации .

Кстати, не рекомендуется использовать тело для запроса GET, поскольку некоторые прокси могут не сохранять его.

0 голосов
/ 22 октября 2018

О вашем вопросе, если вы можете создать пользовательский заголовок по вашему требованию.Мой ответ ДА.

Как уже упоминалось выше, вы можете использовать стандартный заголовок Авторизация для отправки токена в каждом запросе.Другой альтернативой является определение пользовательского заголовка.Однако вам придется реализовать на стороне сервера логику для поддержки этого пользовательского заголовка.

Подробнее об этом можно прочитать здесь

0 голосов
/ 20 октября 2018

Ну, REST - это просто обобщение концепций, которые уже много лет используются в браузерной сети.При последовательном применении этих концепций в ваших приложениях вы получите свободу для развития серверной части, одновременно получая устойчивость к изменениям на стороне клиента.Однако, чтобы воспользоваться такими сильными свойствами, необходимо соблюдать определенное количество ограничений, таких как соблюдение правил базового транспортного протокола или использование HATEOAS для дальнейшего управления состоянием приложения.Любая внеполосная информация, необходимая для взаимодействия со службой, приведет к связыванию и, следовательно, может либо сломать клиентов, либо предотвратить изменение серверов в будущем.

Распространенным заблуждением в архитектуре архитектуры REST является то, чтоURI должны быть осмысленными и выражать семантику для клиента.Однако в архитектуре REST URI - это просто указатель на ресурс, который клиент никогда не должен анализировать.Решение о том, следует ли вызывать URI, должно приниматься на основе сопутствующего имени отношения ссылки, которое может быть дополнительно описано в типе носителя или в общих стандартах.Т.е. в отношении ссылки на коллекцию с возможностью просмотра страниц, например prev, next, first или last, клиент может выбрать просмотр коллекции.Поэтому фактическая структура URI вообще не важна для REST.Слишком спроектированные URI могут привести к типизированным ресурсам .Поэтому мне не нравится термин на самом деле.Как тогда выглядят non-restful-url?

Хотя отправка всего через POST запросов технически является допустимой опцией, она также имеет некоторые недостатки, которые следует учитывать.IANA ведет список доступных HTTP-методов , которые вы можете использовать.Каждый метод передает разные обещания и семантику.Т.е. клиент, запускающий операцию GET на сервере, должен быть безопасным, предполагая, что вызов ресурса не вызывает каких-либо изменений состояния (безопасно), и в случае проблем с сетью запрос может быть повторно выполнен без каких-либо дополнительных соображений (идемпотент).Это очень важные преимущества для веб-сканеров.Кроме того, промежуточные узлы могут определять на основе метода запроса и полученного ответа, может ли ответ кэшироваться или нет.Хотя это не обязательно является проблемой с точки зрения отделения клиентов от серверов, это помогает убрать ненужную рабочую нагрузку с самого сервера, особенно когда состояние ресурса изменяется, улучшая масштабируемость всей системы.

POST, с другой стороны, не передает такие свойства.При отправке запроса POST на получение данных клиент не может быть уверен, действительно ли запрос приводит к изменениям состояния ресурсов или нет.При возникновении проблемы с сетью запрос мог достигнуть сервера и, возможно, создать новый ресурс, хотя ответ был просто потерян в середине пути, что могло бы держать клиента в состоянии неопределенности, может ли он просто повторно отправить запрос или нет.Кроме того, ответы для операций POST по умолчанию не кэшируются, только после явного добавления к ним информации о свободе.Вызов метода POST запрашивает целевой ресурс для обработки предоставленного представления в соответствии с собственной семантикой ресурсов.Поскольку буквально все что угодно может быть отправлено на сервер, важно, чтобы сервер обучал клиента тому, как должен выглядеть запрос.В HTML, т. Е. Это делается с помощью веб-форм, где пользователь может заполнить данные в определенных полях ввода и затем отправить данные на сервер, нажав кнопку отправки.Та же концепция может быть применена и для мобильных или REST-приложений.В этом вам может помочь повторное использование HTML-форм или определение собственной application/vnd.company-x.forms+json, где описание этого типа носителя публикуется (или регистрируется в IANA).

Фактический вопрос о том, куда включать определенные данные, к сожалению, является общим, чтобы дать краткий ответ.Кроме того, это зависит от того, должны ли данные быть общими или иметь какие-то проблемы с безопасностью.Хотя параметры могут передаваться на сервер через параметры URL (запрос, матрица, путь) до определенной степени , это, вероятно, не лучший вариант в общем случае, хотя параметры запроса шифруются во взаимодействиях SSL .Эта опция, тем не менее, удобна, если URI должен быть вставляемым без потери информации.Тогда это, конечно, не должно содержать данных, связанных с безопасностью.Информация, связанная с безопасностью, почти всегда должна передаваться в заголовках HTTP или, по крайней мере, в самой полезной нагрузке.

Обычно вы должны различать контент и метаданные, описывающие контент.В то время как контент должен быть фактической полезной нагрузкой запроса / ответа, любые метаданные, описывающие контент, должны идти внутри заголовков.Подумайте об изображении, которое вы хотите передать.Поскольку вы не хотите связываться с байтами изображения, вы просто добавляете имя изображения, формат сжатия и другие свойства, описывающие, как преобразовать байты обратно в представление изображения в заголовках.Эта дискриминация, вероятно, лучше всего подходит для стандартизированных форматов представления, поскольку вы должны быть в пределах возможностей спецификации, чтобы гарантировать совместимость.Тем не менее, даже там все может стать нечетким.То есть в области EDI существует пара четко определенных стандартов, таких как Edifact, Tradacoms и т. Д., Которые можно использовать для обмена различными форматами сообщений, такими как счета, заказы, ответы на заказы ... хотя разные системы ERP говорят на разных сленгахи вот тут все начинает усложняться и запутываться.

Если вы управляете своим форматом представления, поскольку вы, вероятно, не стандартизировали его или определили его лишь расплывчато, но все еще может быть сложнее определить, следует ли ставитьон просматривает ваш документ или добавляет его через заголовки.Здесь все зависит только от вашего дизайна.Я также видел представления, которые определяли собственные разделы заголовка в полезной нагрузке и поэтому воссоздали SOAP-подобную структуру envelop-header-body.

...