Подтвердить что ты не робот

Если вызовы api должны быть GET или POST

Я заметил, что некоторые API, такие как twitter API, используют методы get для всего, поэтому параметры передаются в URL-адресе, подобном этому

http://api.twitter.com/1/statuses/user_timeline.json?screen_name=screenname

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

  • Я всегда думал, что использование GET - не очень хорошая идея и что лучше использовать POST.

  • API, который я кодирую, требует ключа, и я не думаю, что это хорошая идея отправить его в URL. Так можно ли смешивать оба параметра POST и параметры URL?

  • Другая проблема заключается в том, что я слышал, что URL-адреса имеют максимальную длину, поэтому я предполагаю, что это сделает GET в стороне, или существует обходное решение

  • Единственная проблема, с которой я столкнулся с POST (и, насколько я понимаю, почему сайт, подобный twitter, пошел с GET), заключается в том, что запрос не может быть сделан непосредственно из браузера. Поправьте меня, если я ошибаюсь.


Обновления: Спасибо всем, кто помогает мне провести мозговой штурм. У меня есть некоторые обновления, чтобы прояснить некоторые комментарии.

  • Когда я говорил о том, что вы не хотите отправлять ключ в URL-адрес, я имел в виду, что я не хочу, чтобы ключ был помечен, если пользователь должен был закладок вызова, а не того, что я не хочу ключ открыт вообще. Поэтому, я думаю, из ответов, я мог бы отправить его в поле заголовка? Любые другие варианты?

  • Я хочу уточнить, что, когда я сказал POST-запросы can't be made from the browser, я должен был сказать, POST requests can't be made from the url, как в http://example.com/api/op.json?param=value. Извините, я оговорился, должен был быть более ясным.

  • Повторите ли это RESTful или нет: я уже делал RESTful с помощью структуры MVC, которая позаботилась об обнаружении глаголов, а URL-адреса выглядели как example.com/entry/1 или example.com/entry/, а http-глаголы что контролирует выполняемую операцию (создание, обновление, удаление, список). В практическом смысле я подумал, что RESTful был наиболее полезен для похожих данных (создать запись, получить запись, обновить запись, удалить запись, показать все записи). Так что, если мне не нужна грудь, мне нужен ОТДЫХ? Мой вопрос: если вызов просто дает ввод и возвращает вывод, должен ли этот API быть RESTful? URL-адрес не выглядит RESTful, так есть ли что-то еще в реализации, которое могло бы сделать его RESTful?

  • Что касается размера URL-адреса, вы прокомментировали but if you're seriously concerned about it you probably should rethink your API. GET requests shouldn't be sending that much data to the server. Итак, у меня есть этот пример: пользователь хочет отправить большой файл. На сервере я не буду вводить файл в базу данных или сохранять его (поэтому в соответствии со стандартами я не "отправляю" данные), но, может быть, я (это быстро продуманные примеры, поэтому, пожалуйста, возьмите их свободно):

    • (a) чтение метаданных файла и возвращение его (должно быть GET или POST) или
    • (б) Я читаю метаданные и изменяю метада в файле и возвращаю измененный файл (должен быть GET или POST).
    • Итак, это пример того, почему мне может понадобиться отправлять большие данные. Вопрос в том, являются ли (а) и (б) рассмотрены операции GET или POST? и именно поэтому я спрашивал о максимальной длине URL
4b9b3361

Ответ 1

1. Я всегда думал, что использование GET не является хорошей идеей и что лучше использовать POST.

Используйте GET для чтения информации, POST для записи информации. Запросы GET не должны изменять состояние на стороне сервера, в то время как запросы POST могут безопасно это делать. В общем случае используйте GET для чтения и POST для записи. Вероятно, ваш API должен использовать смесь обоих, в зависимости от того, что делает каждый конкретный вызов API.

2. Для кодирования API я требую ключ, и я не думаю, что это хорошая идея отправить его в URL. Так возможно ли смешивать оба параметра POST и параметры URL?

Отправка данных через POST не добавляет никакого уровня безопасности вообще. Запросы GET не менее небезопасны, чем запросы POST; они идентичны. Для передачи личных данных используйте SSL.

3. Другая проблема заключается в том, что я слышал, что URL-адреса имеют максимальную длину, поэтому я предполагаю, что это сделает GET в стороне, или существует обходное решение

Максимальной длины URL, определенной стандартом HTTP, не существует, хотя некоторые браузеры накладывают один. Это, вероятно, не имеет значения при генерации запросов GET через JavaScript, но если вас это серьезно волнует, вы, вероятно, должны пересмотреть свой API. Запросы GET не должны отправлять столько данных на сервер.

4. Единственная проблема, с которой я столкнулся с POST (и что я предполагаю, почему сайт, подобный twitter, пошел с GET), заключается в том, что запрос не может быть сделан непосредственно из браузера. Исправьте меня, если я ошибаюсь.

Ваш браузер может генерировать POST-запросы так же легко, как и запросы GET, а просто отправлять запросы POST через адресную строку.

Ответ 2

Более полный ответ: прочитайте REST и HTTP-глаголы в целом.

Вот несколько коротких ответов на ваши вопросы:

Я всегда думал, что использование GET не хорошая идея и что лучше используйте POST.

Это зависит от того, что вы делаете.

Для кодирования API я требуется ключ, и Я не думаю, что это хорошая идея отправить это в URL. Так можно ли смешивать оба параметра POST и URL параметры?

Да, это возможно. Тем не менее, не будет большой разницы в безопасности между отправкой через URL-адрес и тело запроса.

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

"Обходной путь" заключается в использовании других глаголов типа POST или PUT для передачи больших объемов данных.

Единственная проблема, которую я вижу с помощью POST (и я думаю, почему сайт как твиттер пошел с GET), это запрос не может быть сделан непосредственно из браузера. Исправьте меня, если я неправильно на этом.

Запросы POST могут быть сделаны непосредственно из браузера с помощью простого HTML <form> с method="POST".

Ответ 3

Как сказал Anon, Get для получения данных, сообщения для внесения изменений/отправки данных, что позволяет вам соответствовать стандарту http. AFAIK, вы не можете смешивать параметры GET/POST. Вы можете сделать почтовый запрос из браузера по форме, но не указав адрес URL в адресной строке. Ключ в строке get и post post не сильно отличается. Если запрос перехватывается в пути, ключ скомпрометирован в любом случае. Если вы используете ключ открытого/закрытого ключа для шифрования ключа, вы можете решить эту проблему. И да, строка GET имеет максимальную длину, но также делает запись, хотя и намного больше и зависит от настроек вашего сервера.

Ответ 4

С точки зрения сервера, не имеет значения, какой механизм используется. Единственная значимая разница на стороне сервера заключается в том, что запросы GET обычно регистрируются полностью (с параметрами), в то время как данные POST-запросов обычно не регистрируются (но это не правило для настраиваемых серверов, которые могут регистрировать или ничего не регистрировать),

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

Запросы GET легче отлаживать (для веб-разработчиков), и, возможно, это была основная причина их использования. Я также могу думать о том, что запросы GET легче обрабатывать и менее ресурсоемкими (но это зависит от того, как написан код), поэтому в запросе GET все передается в заголовке, а CRLFCRLF - это разделитель запросов (с POST ему необходимо выполнить дополнительный синтаксический анализ тела).

URL-адреса имеют макс. длина (4K - общий предел, но не обязательный), да. Некоторые прокси и некоторые серверы (и, возможно, некоторые клиенты) могут не иметь возможности обрабатывать большие URL-адреса или иметь искусственное ограничение (чтобы предотвратить атаки).

Я не уверен, что понял вашу идею о том, что "запрос не может быть сделан непосредственно из браузера". Когда вы заполняете веб-форму в браузере, она отправляется на сервер (если не используется JavaScript или AJAX, причиной их использования может быть запрос GET).

Ответ 5

Почему бы не поддержать оба? Это самый гибкий. Я написал только один API (несколько версий) и поддерживаю как GET, так и POST для всех переменных, пригодится как при реализации клиента, так и при отладке. Он поддерживает смешивание и сопоставление GET и POST. Используйте $_REQUEST и делайте это.