REST API - PUT vs PATCH с примерами из реальной жизни

Если вы хотите получить хороший результат, вам необходимо применить цветовой профиль. В .NET вы можете сделать это так (предполагая, что исходные компоненты CMYK находятся в диапазоне от 0 до 255):

float[] colorValues = new float[4];
colorValues[0] = c / 255f;
colorValues[1] = m / 255f;
colorValues[2] = y / 255f;
colorValues[3] = k / 255f;

System.Windows.Media.Color color = Color.FromValues(colorValues,
    new Uri(@"C:\Users\me\Documents\ISOcoated_v2_300_eci.icc"));
System.Drawing.Color rgbColor = System.Drawing.Color.FromArgb(color.R, color.G, color.B);

Обратите внимание, что используются два разных класса Color из двух разных пространств имен. Вероятно, вам нужно добавить DLL PresentationCore в качестве ссылки.

Необходимый профиль цвета можно загрузить из раздела загрузки eci.org . Это часть большого ZIP-файла, содержащего несколько профилей. Они явно рекомендуют использовать профиль ISO Coated v2 300% (ECI).

Если вам нужно преобразовать полное изображение из CMYK в RGB, для этого в этом пространстве имен есть специальные классы.

557
задан Julian Reschke 6 September 2016 в 05:20
поделиться

4 ответа

ПОМЕЩЕННЫЙ по сравнению с ПАТЧЕМ Большое объяснение здесь: https://medium.com/backticks-tildes/restful-api-design-put-vs-patch-4a061aa3ed0b

0
ответ дан 3 October 2019 в 23:11
поделиться

По моему скромному мнению, средствам идемпотентности:

  • ПОМЕЩЕННЫЙ:

я отправляю конкурировать определение ресурса, таким образом - получающееся состояние ресурса точно как определяется ПОМЕЩЕННЫМИ параметрическими усилителями. Каждый раз, когда я обновляю ресурс с теми же ПОМЕЩЕННЫМИ параметрическими усилителями - получающееся состояние является точно тем же.

  • ПАТЧ:

я отправил только часть определения ресурса, таким образом, это могло бы произойти, другие пользователи обновляют ДРУГИЕ параметры этого ресурса в тем временем. Следовательно - последовательные патчи с теми же параметрами и их значениями могли бы закончиться с другим состоянием ресурса. Например:

Считают объект определенным следующим образом:

CAR: - цвет: черный, - тип: седан, - места: 5

я исправляю его с:

{цвет: 'красный'}

полученный объект:

CAR: - цвет: красный, - тип: седан, - места: 5

Затем некоторые другие пользователи исправляют этот автомобиль с:

{тип: 'хэтчбек'}

так, полученный объект:

CAR: - цвет: красный, - тип: хэтчбек, - места: 5

Теперь, если я исправляю этот объект снова с:

{цвет: 'красный'}

полученный объект:

CAR: - цвет: красный, - тип: хэтчбек, - места: 5

, Что ОТЛИЧАЕТСЯ от того, что я имею ранее!

Поэтому ПАТЧ не является идемпотентом, в то время как ПОМЕЩЕНО идемпотент.

1
ответ дан 22 November 2019 в 21:58
поделиться

TLDR - Dumbed Вниз Версия

ПОМЕЩАЮТ => Набор все новые атрибуты для существующего ресурса.

ПАТЧ => Частично обновляют существующий ресурс (не все требуемые атрибуты).

0
ответ дан 22 November 2019 в 21:58
поделиться

Для завершения обсуждения idempotency я должен отметить, что можно определить idempotency в остальных контекст двумя способами. Давайте сначала формализуем несколько вещей:

А ресурс является функцией со своей областью изменения, являющейся классом строк. Другими словами, ресурс является подмножеством String × Any, где все ключи уникальны. Давайте назовем класс ресурсов Res.

операция REST А на ресурсах, функция f(x: Res, y: Res): Res. Два примера операций REST:

  • PUT(x: Res, y: Res): Res = x, и
  • PATCH(x: Res, y: Res): Res, который работает как PATCH({a: 2}, {a: 1, b: 3}) == {a: 2, b: 3}.

(Это определение специально предназначено для утверждения приблизительно PUT и POST, и например, не имеет большого количества смысла на GET и POST, поскольку это не заботится о персистентности).

Теперь, путем фиксации x: Res (informatically разговор, с помощью приправляющий карри), PUT(x: Res) и PATCH(x: Res) одномерные функции типа Res → Res.

  1. , функция g: Res → Res вызвана глобально идемпотентный , когда g ○ g == g, т.е. для любого y: Res, g(g(y)) = g(y).

  2. Позволяют x: Res ресурс, и k = x.keys. Функция g = f(x) вызвана оставленный идемпотент , когда для каждого y: Res, мы имеем g(g(y))|ₖ == g(y)|ₖ. Это в основном означает, что результат должен быть тем же, если мы смотрим на прикладные ключи.

Так, PATCH(x) не глобально идемпотент, но оставлен идемпотент. И оставленный idempotency является вещью, которая имеет значение здесь: если мы исправляем несколько ключей ресурса, мы хотим, чтобы те ключи были тем же, если мы исправляем его снова, и мы не заботимся об остальной части ресурса.

И когда RFC говорит о ПАТЧЕ, не являющемся идемпотентом, говорит он о глобальном idempotency. Ну, хорошо, что это не глобально идемпотент, иначе это была бы поврежденная операция.

<час>

Теперь, ответ Jason Hoetger пытается продемонстрировать, что ПАТЧУ даже не оставляют идемпотент, но он повреждает слишком много вещей сделать так:

  • , В первую очередь, ПАТЧ используется на наборе, хотя ПАТЧ определяется для работы над картами / словари / объекты значения ключа.
  • , Если кто-то действительно хочет применить ПАТЧ к наборам, тогда существует естественный перевод, который должен использоваться: t: Set<T> → Map<T, Boolean>, определенный с [1 125]. Используя это определение, исправлению оставляют идемпотент.
  • В примере, этот перевод не использовался, вместо этого, работы ПАТЧА как POST. В первую очередь, почему идентификатор сгенерирован для объекта? И когда это сгенерировано? Если объект является первым по сравнению с элементами набора, и если никакой соответствующий объект не найден, то идентификатор сгенерирован, с другой стороны программа должна работать по-другому ({id: 1, email: "me@site.com"}, должен соответствовать [1 127], иначе программа всегда повреждается, и ПАТЧ не может возможно исправить). Если идентификатор сгенерирован прежде, чем проверить по набору, снова программа повреждается.

можно сделать примеры ПОМЕЩЕННЫХ, являющихся неидемпотентом с повреждающейся половиной вещей, которые повреждаются в этом примере:

  • пример с [1 135] сгенерированными дополнительными функциями было бы управление версиями. Можно вести учет количества изменений на отдельном объекте. В этом случае, ПОМЕЩЕННЫЙ не идемпотент: PUT /user/12 {email: "me@site.com"} результаты в [1 129] в первый раз, и {email: "...", version: 2} во второй раз.
  • Питание с идентификаторами, можно генерировать новый идентификатор каждый раз, когда объект обновляется, приводя к ПОМЕЩЕННОМУ неидемпотенту.

Всеми вышеупомянутыми примерами являются естественные примеры, с которыми можно встретиться.

<час>

Мой конечный пункт, тот ПАТЧ не должен быть глобально идемпотентный , иначе не даст Вам желаемый эффект. Вы хотите изменить адрес электронной почты своего пользователя без касающейся остальной части информации, и Вы не хотите перезаписывать изменения другой стороны, получающей доступ к тому же ресурсу.

1
ответ дан 22 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: