Удостоверьтесь, что включали надлежащий DOCTYPE.
я все еще вижу людей, регулярно справляющихся с проблемами модели поля, потому что они забыли включать doctype. Без надлежащего doctype Internet Explorer представляет в "режиме причуд", и также - другие браузеры до меньшей степени. При включении надлежащего doctype браузеры переключаются на "стандартный режим" и ведут себя очень похожие друг на друга.
Другой тогда, что, если Вы делаете это для жизни, Вы будете быстро брать и помнить те тонкие угловые случаи, где IE интерпретирует вещи, немного отличающиеся из Firefox, и т.д. С некоторым опытом, совершенно возможно разработать всю страницу в Вашем любимом браузере и только сделать очень крошечные тонкие настройки к CSS, чтобы заставить его представить почти пиксель, прекрасный в других браузерах.
Возможно что-то вроде:
PUT /parameters/activation HTTP/1.1
Content-Type: application/json; encoding=UTF-8
Content-Length: 18
{ "active": true }
Общие принципы правильного дизайна URI:
/ resource
, либо / ресурс /
; создать 301 редирект из того, который вы не используете. (Примечание: я не сказал "
201 Создано
после создания ресурса; ресурс должен существовать на момент отправки ответа 202 Принято
после успешного выполнения операции или создания ресурса асинхронно 400 Плохой запрос
, когда кто-то выполняет операцию с данными это явно подделка; для вашего приложения это может быть ошибка проверки; обычно резервируют 500 для неперехваченных исключений 401 Unauthorized
, когда кто-то обращается к вашему API без предоставления необходимого заголовка Authorization
или когда учетные данные в Authorization
недействительны; не используйте этот код ответа, если вы не ожидаете учетных данных через заголовок Authorization
.
Заголовки ETag
хороши, когда вы можете легко уменьшить ресурс до хэш-значения Last-Modified
должны указать вам, что сохранение отметки времени, когда обновляются ресурсы, является хорошей идеей Cache-Control
и Expires
должны иметь разумные значения If-None-Modified
, If-Modified-Since
) Что касается вашего конкретного вопроса, POST следует использовать для № 4 и № 5. Эти операции подпадают под действие приведенного выше принципа «RPC-подобного». Что касается # 5, помните, что POST не обязательно должен использовать Content-Type: application / x-www-form-urlencoded
.
Дизайн ваших URL-адресов не имеет ничего общего с тем, является ли ваше приложение RESTful или нет. Таким образом, фраза «RESTful URL» не имеет смысла.
Думаю, вам стоит еще раз прочитать, что такое REST на самом деле. REST рассматривает URL-адреса как непрозрачные и поэтому не знает, что в них содержится, есть ли глаголы, существительные или что-то еще. Возможно, вы все равно захотите разработать свои URL-адреса, но это касается пользовательского интерфейса, а не REST.
Тем не менее, давайте перейдем к вашему вопросу: последние два случая не относятся к RESTful и не вписываются ни в какую успокаивающую схему. Это то, что вы могли бы назвать RPC. Если вы серьезно относитесь к REST, вам придется переосмыслить принцип работы вашего приложения с нуля. Либо так, либо откажитесь от REST и просто сделайте свое приложение RPC-приложением.
Хммм, может, и нет.
Когда вам кажется, что вам нужен новый глагол, подумайте о том, чтобы вместо этого превратить этот глагол в существительное. Например, превратите «активировать» в «активацию», а «проверить» - в «проверку».
Но исходя из того, что вы написали, я бы сказал, что ваше приложение имеет гораздо более серьезные проблемы.
Каждый раз, когда ресурс называется «параметр», он должен вызывать тревогу у каждого члена команды проекта. «параметр» может применяться буквально к любому ресурсу; он недостаточно конкретен.
Что именно означает «параметр»? Вероятно, множество разных вещей, каждой из которых должен быть посвящен отдельный ресурс.
Другой способ понять это - когда вы обсуждаете свое приложение с конечными пользователями (теми, кто предположительно мало разбирается в программировании), какие слова они сами часто используют?
Это те слова, на основе которых вы должны проектировать свое приложение .
Если у вас еще не было этого преобразования с потенциальными пользователями - остановите все прямо сейчас и не пишите ни одной строчки кода, пока не сделаете это! Только тогда ваша команда будет иметь представление о том, что необходимо создать.
Я ничего не знаю о финансовом программном обеспечении, но если бы мне пришлось угадывать, я бы сказал, что некоторые ресурсы могут иметь такие названия, как «Отчет», «Платежи», «Перевод» и «Валюта».
Есть ряд хороших книг по этой части процесса разработки программного обеспечения.
Я бы предложил следующие мета-ресурсы и методы.
Сделайте параметры активными и / или подтвердите их:
> PUT /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Content-Type: application/json
> Connection: close
>
> {'active': true, 'require-valid': true}
>
< HTTP/1.1 200 OK
< Connection: close
<
Проверьте, являются ли параметры активными и действительными:
> GET /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Connection: close
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Connection: close
<
< {
< 'active': true,
< 'require-valid': true,
< 'valid': {'status': false, 'reason': '...'}
< }
<
Изменить: Действительно, URI предотвратил бы сохранение идемпотентности запросов GET
.
Однако для проверки использование кодов состояния HTTP для уведомления о действительности запроса (для создания нового или изменения существующего «параметра») соответствовало бы модели Restful.
Сообщите с кодом состояния 400 Bad Request
, если отправленные данные являются недопустимыми и запрос необходимо изменить перед повторной отправкой ( Коды состояния HTTP / 1.1 ).
Это зависит от проверки во время отправки, а не откладывает ее, как в вашем случае использования. В других ответах есть подходящие решения для этого сценария.
В среде REST каждый URL-адрес является уникальным ресурсом. Какие у вас ресурсы? Финансовый калькулятор действительно не имеет очевидных ресурсов. Вам нужно вникнуть в то, что вы вызываете, параметры и вытащить ресурсы. Например, календарь погашения ссуды может быть ресурсом. URL-адрес календаря может включать дату начала, срок (в месяцах или годах), период (когда начисляются проценты), процентную ставку и начальный принцип. Со всеми этими значениями у вас есть особый календарь платежей:
http://example.com/amort_cal/2009-10-20/30yrsfixed/monthly/5.00/200000
Я не знаю, что вы рассчитываете, но ваша концепция списка параметров не звучит как RESTful. Как сказал кто-то другой, ваши требования выше звучат более XMLRPC. Если вы пытаетесь использовать REST, вам нужны существительные. Вычисления - это не существительные, это глаголы, действующие на существительные.
Требования активации и проверки - это ситуации, когда вы пытаетесь изменить состояние ресурс. Это ничем не отличается от того, что делается заказ «выполнен» или какой-либо другой запрос «отправлен». Существует множество способов моделирования таких изменений состояния, но один, который, как я считаю, часто срабатывает, - это создание ресурсов коллекции для ресурсов одного и того же состояния, а затем перемещение ресурса между коллекциями, чтобы повлиять на состояние.
например, Создайте некоторые ресурсы, такие как,
/ActiveParameters
/ValidatedParameters
Если вы хотите сделать набор параметров активным, добавьте этот набор в коллекцию ActiveParameters. Вы можете либо передать набор параметров в виде тела объекта, либо передать URL-адрес в качестве параметра запроса, как показано ниже:
POST /ActiveParameters?parameter=/Parameters/{Id}
То же самое можно сделать с помощью параметра / ValidatedParameters. Если параметры недействительны, сервер может вернуть «неверный запрос» к запросу, чтобы добавить параметры в коллекцию проверенных параметров.
Существует множество способов моделирования таких изменений состояния, но один, который, как я считаю, часто срабатывает, - это создание ресурсов коллекции для ресурсов одного и того же состояния, а затем перемещение ресурса между коллекциями, чтобы повлиять на состояние.например, Создайте некоторые ресурсы, такие как,
/ActiveParameters
/ValidatedParameters
Если вы хотите сделать набор параметров активным, добавьте этот набор в коллекцию ActiveParameters. Вы можете либо передать набор параметров в виде тела объекта, либо передать URL-адрес в качестве параметра запроса, как показано ниже:
POST /ActiveParameters?parameter=/Parameters/{Id}
То же самое можно сделать с помощью параметра / ValidatedParameters. Если параметры недействительны, сервер может вернуть «неверный запрос» к запросу, чтобы добавить параметры в коллекцию проверенных параметров.
Существует множество способов моделирования таких изменений состояния, но один, который, как я считаю, часто работает, - это создание ресурсов коллекции для ресурсов одного и того же состояния, а затем перемещение ресурса между коллекциями, чтобы повлиять на состояние.например, Создайте некоторые ресурсы, такие как,
/ActiveParameters
/ValidatedParameters
Если вы хотите сделать набор параметров активным, добавьте этот набор в коллекцию ActiveParameters. Вы можете либо передать набор параметров в виде тела объекта, либо передать URL-адрес в качестве параметра запроса, как показано ниже:
POST /ActiveParameters?parameter=/Parameters/{Id}
То же самое можно сделать с помощью параметра / ValidatedParameters. Если параметры недействительны, сервер может вернуть «неверный запрос» к запросу, чтобы добавить параметры в коллекцию проверенных параметров.
Вы можете либо передать набор параметров в виде тела объекта, либо передать URL-адрес в качестве параметра запроса, как показано ниже:POST /ActiveParameters?parameter=/Parameters/{Id}
То же самое можно сделать с помощью параметра / ValidatedParameters. Если параметры недействительны, сервер может вернуть «неверный запрос» к запросу, чтобы добавить параметры в коллекцию проверенных параметров.
Вы можете либо передать набор параметров в виде тела объекта, либо передать URL-адрес в качестве параметра запроса, как показано ниже:POST /ActiveParameters?parameter=/Parameters/{Id}
То же самое можно сделать с помощью параметра / ValidatedParameters. Если параметры недействительны, сервер может вернуть «неверный запрос» к запросу, чтобы добавить параметры в коллекцию проверенных параметров.