php curl content type application json

cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностью

В этой статье мы рассмотрим эффективные приемы работы с cURL, отправление POST, GET и т.д. запросов, работу с cookie, заголовки, JSON а также в конце статьи будут некоторые полезные инструменты, которые могут значительно облегчить вам работу с HTTP запросами.

GET запрос при помощи cURL

Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.

Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.

Пример простого GET запроса при помощи cURL:

Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION.

С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.

POST запрос при помощи cURL

Теперь давайте отправим post запрос на адрес https://httpbin.org/anything

Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе.

Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON

cURL: POST запрос в формате JSON

Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json

cURL: GET запрос в формате JSON

GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в ‘GET’

cURL и другие виды HTTP запросов: PUT, DELETE, HEAD, PATCH, OPTIONS, CONNECT и т.д.

Стоп, Дмитрий, прекрати выдумывать виды запросов!

Ничего я не выдумываю: HTTP протокол предполагает множество типов HTTP запросов просто POST и GET являются более распространенными.

Чтобы отправить PUT запрос, нужно установить опцию CURLOPT_PUT таким образом:

Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет.

Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST

Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST:

Замечание: Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.

Как получить заголовки ответа

В предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки:

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

Рассмотрим такой пример:

Мы сначала определяем размер заголовка, с помощью CURLINFO_HEADER_SIZE затем вырезаем его из ответа. К сожалению, это может не срабатывать, когда используется прокси или в некоторых случаях редиректа.

Скачивание больших файлов с помощью cURL

Для того, чтобы скачать большой файл пригодится этот способ:

Обратите внимание, если вы будете использовать file_get_contents для скачивания файлов, то файл сначала загружается в оперативную память, а потом сохраняется на диск. Поэтому если файл действительно большой, то скорее всего вашему серверу не хватит памяти. Также к памяти будет требователен следующий код:

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

Параллельные cURL запросы в PHP

Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:

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

Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_

Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.

Такие параллельные запросы выполняются значительно быстрее чем поочередные.

cURL запросы с сохранением и загрузкой cookie из файла

cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.

Давайте рассмотрим такой пример:

Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами.

Передача cookie без файлов

Иммитация браузера с помощью cURL

Иногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер.

В данном примере установлены заголовки, которые посылает Chrome.

В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium.

Не используйте эти знания в противоправных целях.

cURL запросы через прокси

Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.

Отправка файлов

Авторизация с помощью cURL

HTTP Авторизация

Чтобы с помощью cURL авторизироваться на сайте, который использует Basic HTTP-аутентификацию нужно установить опцию CURLOPT_USERPWD, в которой будет наш логин и пароль.

OAuth авторизация

Авторизация через форму

Давайте применим полученные нами знания и авторизируемся на каком-нибудь сайте. Для этого нужно посмотреть куда форма отправляет данные и отправить туда то же самое.

Допустим на сайте есть такая форма:

Тогда наш cURL запрос должен быть сформирован так:

Автоматическое построение запросов

Перевод консольной команды curl в PHP

И вот еще один сервис, который переводит консольную команду curl в PHP: https://incarnate.github.io/curl-to-php/

Так вы можете создать простые запросы на cURL в PHP не создавая их вручную.

Лайфхак

В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.

Как работать с cURL гораздо проще

Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:

К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class

Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.

POST и GET запросы без cURL

С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.

При помощи file_get_contents мы также можем отправить POST запрос.

Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php

Другие инструменты для работы с запросами в PHP

Для работы с запросами есть еще более мощный инструмент: Guzzle

Несколько примеров на Guzzle

GET запросы на Guzzle

Разные типы запросов на Guzzle

Асинхронные запросы на Guzzle

Если интересно, то читайте: Guzzle Quick Start

Пишите комментарии, если что-то осталось не понятно.

Источник

Что JavaScript-разработчику следует знать о Curl

Доброго времени суток, друзья!

Представляю Вашему вниманию перевод статьи «What JavaScript Developers Should Know About Curl» автора Valery Karpov.

Curl — это популярный инструмент командной строки, часто используемый для отправки HTTP-запросов. Curl поддерживает большое количество протоколов, однако как Node.js-разработчик вы, скорее всего, будете использовать его для отпраки http-запросов к RESTful API.

Документация curl представляет собой перечень из 383 флагов командной строки, поэтому в ней очень трудно найти то, что ищешь. В этой статье я хочу поделиться с вами некоторыми часто используемыми мной шаблонами. Для примеров будет использоваться сервис httpbin.org.

Отправка http-запроса

Загрузка файлов

Wget — самый распространенный инструмент для загрузки файлов посредством командной строки. Он входит в комплект большинства диструбутивов Linux. Однако в OSX его нет.

php curl content type application json. Смотреть фото php curl content type application json. Смотреть картинку php curl content type application json. Картинка про php curl content type application json. Фото php curl content type application json

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

Отправка авторизованного запроса

Вот что происходит при отправке неправильного имени пользователя или пароля:

Отправка POST-запроса, содержащего JSON

Отправка PUT-запроса, содержащего JSON-файл

Заключение

Резюмируя, вот опции curl, которые я нахожу самыми полезными:

Благодарю за потраченное время. Надеюсь, оно было потрачено не зря.

Источник

POST JSON with PHP cURL

I have the following php code

10 Answers 10

you can use this and replace with

If:you use post method,you should know that:

CURLOPT_POST TRUE to do a regular HTTP POST. This POST is the normal application/x-www-form-urlencoded kind, most commonly used by HTML forms.

So:you can do like this:

This is my class I have used for a long time.The class is based on PHP cURL. It supports GET/POST,HTTP/HTTPS.

php curl content type application json. Смотреть фото php curl content type application json. Смотреть картинку php curl content type application json. Картинка про php curl content type application json. Фото php curl content type application json

You can post a json data with curl like so:

Using Command Prompt:

You haven’t set the content type, so the post data is being sent as form data. Try setting the content type to application/json.

If that doesn’t work, try wrapping the json string with an array.

This works as json decode converts a json string into array.

if your API endpoint using body for send request using json data may be you can use Guzzle the doc is here doc.

php curl content type application json. Смотреть фото php curl content type application json. Смотреть картинку php curl content type application json. Картинка про php curl content type application json. Фото php curl content type application json

I’m not sure, that this is the solution but this works for me when posting json, change the json from

The only change i made was the double quotes are now on the outside, that works for me but I’m obviously posting to a different server

Only other help I could offer is to download a network debugging tool such as Fiddler or Charles proxy and monitor the requests sent/received, it could be a case that something else is wrong in your code.

Источник

POST JSON with PHP cURL and show JSON response

I’ve looked a lot around on Stack Overflow to find an answer to my issue, but simply can’t. I’m trying to post the following JSON

I don’t get any response, even though it works fine with jQuery and AJAX. When I check Chrome’s developer tools, the method is GET, which is weird as I set it to POST in the code.

Any ideas what I’m doing wrong?

5 Answers 5

Try to make GET request with your JSON string as request body:

Have you been able to see what your args look like on the receiving end?

php curl content type application json. Смотреть фото php curl content type application json. Смотреть картинку php curl content type application json. Картинка про php curl content type application json. Фото php curl content type application json

I know the question is 2 years old but its still getting a lot of views.

This looks like a SSL problem. You could try:

php curl content type application json. Смотреть фото php curl content type application json. Смотреть картинку php curl content type application json. Картинка про php curl content type application json. Фото php curl content type application json

CURLOPT_POSTFIELDS: must like this «a=1111&b=2222»

Not the answer you’re looking for? Browse other questions tagged php json curl or ask your own question.

Related

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.9.17.40238

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

How can I send a raw JSON using PHP curl with the content type «application/x-www-form-urlencoded»?

Let me explain:

I’m communicating with a webserver that accepts HTTP POST requests with a JSON object as the body of the request where normally we are used to seeing HTTP query parameters.

In my situation, I need to send a request with the following content-type

The body must be raw JSON.

So, there are many possibilities. I tried the following:

I also tried to escape the json_encode() :

If the server was able to parse html parameters I could just do this:

However, that is not the case and I need a workaround.

2 Answers 2

Usually the application/x-www-form-urlencoded requires a key-value paired parameters for HTTP post. So it’s very hard to suggest anything to you without seeing a sample POST data format. As per the document, you must place the URLencoded data with a variable. For example your JSON should go like this.

You can try sending the data without any key parameter, and it should not work

php curl content type application json. Смотреть фото php curl content type application json. Смотреть картинку php curl content type application json. Картинка про php curl content type application json. Фото php curl content type application json

I’m not entirely sure I understand your question, so I’m going to answer two different versions.

Send JSON data, but with an (inaccurate) application/x-www-form-urlencoded Content Type

I don’t know why you’d want to do this, but if you do, it should be fairly simple.

Bear in mind that you are, here, sending deliberately inaccurate data to the server. You’re sending JSON, but calling it urlencoded. You probably don’t want to do this; if, for some reason, you do need to do this, you’d probably be better off fixing whatever the real problem is, rather than using this hacky workaround.

Send urlencoded JSON data

This is an odd setup, but accurate. At least you wouldn’t be lying in your HTTP headers.

Basically the same as above, but add this:

What you probably really should do: send JSON as JSON.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *