Что лучший способ состоит в том, чтобы разработать Запрос HTTP, когда несколько сложные параметры необходимы?

Для каждого пикселя необходимо преобразовать от цвета до шкалы полутонов - что-то как $grey = $red * 0.299 + $green * 0.587 + $blue * 0.114; (это весовые коэффициенты NTSC; существуют другие подобные коэффициенты. Это подражает переменной скорости отклика глаза к различным цветам).

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

Просто сравнение каждого пикселя к сокращению теряет много детали - т.е. большие темные области идут абсолютно черные - так для сохранения большей информации, можно размыться. В основном запустите наверху оставленный изображения: поскольку каждый пиксель добавляет ошибку (различие между исходным значением и финалом присвоенное значение) для пикселей налево и выше прежде по сравнению со значением сокращения.

знать, что выполнение в этом PHP будет очень медленным - необходимо было бы гораздо дальше вперед найти библиотеку, которая обеспечивает это.

31
задан Community 23 May 2017 в 10:31
поделиться

9 ответов

Я рекомендую вам прочитать спецификацию HTTP 1.1 , особенно разделы 3.2 Унифицированные идентификаторы ресурсов и 9.1.1 Безопасные методы ]. Надеюсь, они ответят на ваш вопрос.


Вот дополнительная информация:

5
ответ дан 27 November 2019 в 22:10
поделиться

Если вы генерируете эти длинные URL-адреса на сервере, вы можете использовать сжатие для информации о пути.

Итак, если у вас есть что-то вроде /? Param1 = bla-bla & param2 = bla-bla, вы просто сжимаете эти параметры и заставляете URL-адрес выглядеть как /? Query = ASsadcnfAFFASFscnsdlc

Когда вы получаете такой запрос, вы просто распаковываете их и анализируете строка параметров

2
ответ дан 27 November 2019 в 22:10
поделиться

Я бы нацелен на HTTP POST. Он красиво токенизируется, когда попадает в PHP (или что бы вы ни использовали), и у него нет ограничений по размеру, которые есть у других.

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

Используйте настраиваемые заголовки HTTP с HTTP GET, если ничего не помогает. Заголовки HTTP могут быть установлены почти всеми клиентами.

Обычно лучше использовать параметры URL в строке запроса. Слишком много параметров URL-адреса означает, что вам необходимо разделить службы на более мелкие.

5
ответ дан 27 November 2019 в 22:10
поделиться

Вы должны поместить параметры в строку запроса, используя запрос HTTP GET. Ограничения в некоторых старых веб-браузерах не вызывают беспокойства, потому что единственные люди, просматривающие API в веб-браузере, скорее всего, будут разработчиками (или, по крайней мере, техническими). ​​

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

Если это невозможно по какой-либо причине, я бы использовал запрос POST с параметрами, закодированными в теле. Это не будет полностью RESTful, но, если ваши ресурсы спроектированы правильно, влияние на клиентский код должно быть минимальным.

2
ответ дан 27 November 2019 в 22:10
поделиться

base64 должен это сделать. в противном случае используйте стандартный знак%.

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

Для этого не существует идеального способа.

Правильный способ HTTP / REST - использовать GET и иметь все параметры в URL-адресе в качестве аргументов запроса. Вы определили две практические проблемы с этим подходом

  1. Ваше серверное программное обеспечение неправильно передает вам некоторые символы, даже если URL-адрес закодирован. На самом деле это меня удивляет, и вам следует более внимательно присмотреться к тому, что происходит, вы даже не можете получить% через URL-адрес. Предоставляет ли ваша структура прямой доступ к PATH_INFO или другим необработанным символам? Это может дать вам обходной путь.
  2. Ваши строки запроса могут быть слишком длинными. Вы упомянули ограничение в 2083 байта в MSIE. Это может быть или не быть для вас практической проблемой, в зависимости от того, является ли MSIE клиентом вашего API. (Т.е. через Javascript вызовы JSON API). Но по моему опыту очень длинные URL-адреса загадочным образом ломаются в нескольких местах; прокси кеширует по пути, даже брандмауэр с отслеживанием состояния. Если у вас есть абсолютный контроль над клиентами и сетевым путем, вы, вероятно, можете жить с опасностями длинных URL-адресов. Если это общедоступный API, забудьте о нем.

Надеюсь, вы сможете заставить простой GET работать в своей среде. Вы даже можете подумать о рефакторинге вашего API, чтобы уменьшить размер данных запроса.

Но что, если вы не можете заставить GET работать? Вы предлагаете несколько альтернатив. Я бы сразу двух из них уволил. Не помещайте содержимое в тело запроса GET; слишком много программного обеспечения сломается, если вы попробуете это, и в любом случае это нарушит тот самый дух REST, который вы пытаетесь захватить. И я бы не стал использовать кодировку base64. Это может помочь вам обойти проблему 1, ваш сервер неправильно обрабатывает некоторые символы в URL-адресах. Но при неправильном применении это фактически сделает ваши URL-адреса длиннее, а не короче, что усугубляет проблему 2. Даже если вы сделаете base64 правильно и включите некоторое сжатие, это не сделает URL-адреса значительно короче и значительно усложнит клиент.

Наиболее практичным решением, вероятно, является вариант 3, HTTP POST. Это не RESTful; вы должны использовать GET для запросов только для чтения. И вы потеряете некоторые преимущества подхода REST с кешированием GET и т.п. С другой стороны, он будет работать правильно и просто с большим разнообразием инфраструктуры Интернета и программных библиотек. Затем вы можете передать столько данных, сколько хотите, в теле POST либо с помощью кодировки multipart / form-data, JSON или XML. (Я создал две основные общедоступные веб-службы с использованием SOAP, который представляет собой просто XML в POST. Это уродливо и не является RESTful, но работает надежно.)

REST - отличная парадигма дизайна. Это руководство. Если он не подходит для вашего приложения, не думайте, что вам нужно его придерживаться. HTTP не подходит для передачи больших объемов данных на сервер с помощью GET. Если вам нужны гигантские параметры запроса, сделайте что-нибудь еще.

28
ответ дан 27 November 2019 в 22:10
поделиться

Я бы определенно начал с того, с чего начали вы: сокращение URL-адресов. Я бы попробовал сократить имена параметров (? A = XXX; b = YYY; c = zzz); Перекодировать весь запрос в Base64; GZip Base64; Хаффман кодирует GZip; ... все, что нужно. Как только я понял, что сокращение не будет работать во всех случаях (у вас есть какая-то динамическая система создания фильтров, которую можно добавлять на неопределенное время или ж / д), тогда вы должны признать, что, возможно, пытаетесь сделать все в рамках одного запроса может не сработать ...

Я НЕ собираюсь предлагать вам бросать несколько GET с параметрами разделения и пытаться таким образом отслеживать запросы ...

Единственный «надежный» Метод, который я МОГУ предложить, - сохранить / установить запрошенную строку запроса в одном запросе (POST) и вернуть ему идентификатор фиксированного размера (или guid), который идентифицирует местоположение параметра запроса в вашем хранилище данных (filterID), а затем выполнить фактический GET запрос с использованием токена filterID вместо значения строки запроса полного фильтра. Это позволит выполнять всевозможные изящные вещи, такие как кэширование ответов на основе filterID, чтобы вы могли (теоретически) повторно использовать те же фильтры позже (вместо того, чтобы повторно вводить их вручную, просто сохраните «метку» вместе с телом фильтра и выберите из последние 5 фильтров по ярлыку) или, по крайней мере, сохранить их вместе с вашими данными, чтобы каждый раз, когда вы обновляете страницу, не отправлялся повторно весь запрос фильтра.

затем выполните фактический запрос GET, используя токен filterID вместо значения строки запроса полного фильтра. Это позволит выполнять всевозможные изящные вещи, такие как кэширование ответов на основе filterID, чтобы вы могли (теоретически) повторно использовать те же фильтры позже (вместо того, чтобы повторно вводить их вручную, просто сохраните «метку» вместе с телом фильтра и выберите из последние 5 фильтров по ярлыку) или, по крайней мере, сохранить их вместе с вашими данными, чтобы каждый раз, когда вы обновляете страницу, не отправлялся повторно весь запрос фильтра.

затем выполните фактический запрос GET, используя токен filterID вместо значения строки запроса полного фильтра. Это позволит выполнять всевозможные изящные вещи, такие как кэширование ответов на основе filterID, чтобы вы могли (теоретически) повторно использовать те же фильтры позже (вместо того, чтобы повторно вводить их вручную, просто сохраните «метку» вместе с телом фильтра и выберите из последние 5 фильтров по ярлыку) или, по крайней мере, сохранить их вместе с вашими данными, чтобы каждый раз, когда вы обновляете страницу, не отправлялся повторно весь запрос фильтра.

2
ответ дан 27 November 2019 в 22:10
поделиться

Рой Филдинг , вероятно, одобрил бы использование POST в этой ситуации, но вы должны спросить его.

В общем, большинство приложений, которые вовлекать данные, предоставленные пользователем, поставляемые на сервер небезопасны. Единственное исключение - когда информация представлена ​​в виде обобщенные параметры запроса, для существует компромисс между GET и POST, которые обычно включают размер содержимого параметра . ПОЛУЧИТЬ желательно только в тех случаях где параметры могут быть выражены как значимый URI.

2
ответ дан 27 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

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