владелец | разработчик |
---|---|
Плагин Fat Free Framework: мост между вашим кодом и внешним REST API. F3-wcurl действует как уровень логической абстракции для cURL, который обрабатывает аутентификацию и кэширование успешных ответов.
Встроенный Web
плагин F3 отлично справляется с отдельными HTTP-запросами и легко обрабатывает их. F3-wcurl создает реализацию всего удаленного API внутри вашего кода.
Со временем мне пришлось быстро создавать инструменты и скрипты, которые выполняли одну важную, но повторяющуюся задачу: обрабатывать запросы, настройки, объекты, ответы cURL и т. д. В конце концов я продолжал копировать одни и те же функции, изменяя их. и отладка тех же проблем , почему что-то не работает, написанных несколько месяцев назад .
Несмотря на то, что у вас есть полный контроль над параметрами cURL и доступ к ним, F3-wcurl не заставляет вас это делать. Это позволяет сосредоточиться на самом запросе, на том, что он меняет и получает взамен. Как плагин для экосистемы F3, он, естественно, получил несколько интересных зависимостей — Prefab
, Cache
и Web
(не для самих запросов cURL).
Класс F3 строится из ассоциативного массива соответствующих настроек. Массив можно передать либо из кода напрямую, либо из INI-файла (импортированного в F3 перед сборкой F3-wcurl) и сохранить в кусте F3.
F3-wcurl использует Prefab и Cache F3, что позволяет вызывать один и тот же объект wcurl в любом месте кода и обеспечивает быструю обработку ответов.
По умолчанию F3-wcurl будет искать ключ wcurl
в кусте F3, но INI может удобно хранить настройки для нескольких различных реализаций REST API.
$ wcurl = wcurl:: instance ([ $ iniName = ' wcurl ' | $ optionsArray ]);
Эта довольно простая структура массива определяет внутреннюю работу wcurl:
имя | тип | по умолчанию | описание |
---|---|---|---|
корень | нить | нулевой | Корень удаленного API, который используется для создания URI запроса. |
cb_login | нить | нулевой | Установите функцию обратного вызова из вашего кода, которая может выполнять аутентификацию, которая должна быть допустимым обратным вызовом для call_user_func() |
ТТЛ | целое число | 60 | Секунды, как долго кэшировать ответы GET |
заголовки | множество | [ ] | cURL действительный массив строк ["Заголовок: значение", "Другой-заголовок: значение"] |
пользовательский агент | нить | F3-версия wcurl | Строка пользовательского агента |
базовая аутентификация | нить | нулевой | Отправьте заголовки Basic Auth, используйте в формате username:password |
токен запроса | нить | нулевой | Добавляйте каждый запрос с токеном URL. |
кодироватьJSON | логическое значение | истинный | Погода сериализует тело POST как JSON, установка false отправит тело в виде обычной HTML-формы. |
завиток | множество | [ ] | Настройки RAW cURL Массив настроек RAW cURL для прямого управления с key => val , где ключ может быть либо константой, либо его строковым именем. |
отдыхает | множество | [ ] | key => val для помощников по построению URL (см. раздел «Примеры») |
Чтобы установить любую опцию из таблицы выше, передайте массив key => val
с одной или несколькими опциями.
$ wcurl -> setOptions (
[
' useragent ' = > ' F3-wcurl API integration ' ,
' encodeJSON ' = > false ,
' ttl ' = > 300 ,
// etc
]
);
Будут обновлены только параметры, которые вы передадите, все остальное останется в предыдущем состоянии/состоянии по умолчанию.
Чтобы очистить один или несколько параметров, передайте имя или список массивов ключей, которые вы хотите сбросить до значений по умолчанию:
$ wcurl -> clearOptions ([ ' useragent ' , ' ttl ' /*, ... etc */ ]);
Чтобы получить полный массив параметров, представляющих текущее состояние класса wcurl:
$ wcurl -> clearOptions ();
Возвращенный многомерный массив должен быть совместим, чтобы создать точно такой же класс, как и извлеченный.
Возвращает статистику о том, сколько запросов выполнено с момента создания класса, сколько/сколько HTTP-ответов получено и сколько отправлено из кеша.
$ wcurl -> getStats ();
В настоящее время поддерживаются функции GET, POST, PUT, PATCH и DELETE. Хотя я буду добавлять больше, когда приду к необходимости их реализации.
$ response = $ wcurl -> get ( string $ url [, array $ fill = null [, array $ options = null ]] );
Я запоминаю подобные аргументы.
НЛО:
$ response = $ wcurl ->post( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO — URL-адрес, заливка, тело, параметры
$ response = $ wcurl ->put( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO — URL-адрес, заливка, тело, параметры
$ response = $ wcurl ->patch( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO — URL-адрес, заливка, тело, параметры
$ response = $ wcurl ->delete( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO — URL-адрес, заливка, тело, параметры
Таблица Rests служит двум одинаково важным целям:
При создании длинных удаленных URL-путей их легче запомнить по коротким ключевым словам, особенно если они вызываются из нескольких мест. Как allmembers
вместо /lists/members/all/pages
. Иногда они также содержат уникальные параметры, которые необходимо заполнять для каждого запроса. Эта концепция является одной из основных причин существования этого плагина.
Продолжайте читать.
Лучше всего хранить удаленные пути в конфигурации .ini
. Переменные URL для заполнения обернуты двумя %
с обеих сторон.
ЗАДАЧА: Сделайте этот символ переноса настраиваемым.
[wcurl.rests]
allmembers =/lists/members/all/pages
withVariable =/lists/members/%%memberID%%/pages
или передать простой key => value
на лету - он будет объединен с предыдущей конфигурацией
$ wcurl -> setOptions (
' rests ' => [
' allmembers ' => ' /lists/members/all/pages ' ,
' withVariable ' => ' /lists/members/%%memberID%%/pages ' ,
' updateEmail ' => ' /lists/members/%%memberID%%/update '
]
);
Чтобы использовать именованный маршрут, передайте его имя вместо полного пути.
$ response = $ wcurl -> get ( ' allmembers ' );
Это приведет к /lists/members/all/pages
$ response = $ wcurl -> get ( ' withVariable ' , array ( ' memberID ' => ' abc123ID ' ) );
Это приведет к /lists/members/abc123ID/pages
Или в запросе POST мы знаем, что необходимо передать следующие параметры UFBO:
$ wcurl -> post ( ' updateEmail ' , // path shorthand to resolve name
[ ' memberID ' => ' abc123ID ' ], // fill this in the path
[ ' email ' => ' [email protected] ' ] // body to send
);
Если вы поместите всю конфигурацию в свой основной ini
файл, класс можно будет инициализировать только при первом его использовании. Т.е. когда ваш код решает отправить get(). В этот момент, если класс не зарегистрирован в Prefab, он будет собран из конфигурации INI именно так, как необходимо.
Полный список опций см. в таблице массива опций, прокрутив несколько прокруток выше.
[wcurl]
root =http://mysite.api/v1
ttl =3600
cb_login =yourClass::cb_do_login
useragent = Zeus was here
headers = " Header: value " , " Another-Header: Value "
[wcurl.rests]
allmembers =/lists/members/all/pages
withVariable =/lists/members/%%memberID%%/pages
; Using with multiple API's
[apitwo]
root =http://yoursite.io/v2
ttl =60
useragent = Big Falcon Rocket
[apitwo.rests]
getUsers =/lists/members/all/pages
getOneUser =/lists/members/%%memberID%%/pages
$ wcurl -> setLogin ( callback ' yourClass::cb_do_login ' );
Если какой-либо запрос приводит к коду HTTP 401 или 403, wcurl
вызывает функцию обратного вызова входа в систему, а затем повторяет исходный запрос. Если снова возникает ошибка, она возвращается к исходному результату функции. wcurl
хранит файлы cookie во временном файле, уникальном для корня API. Этот файл cookie включается в каждый запрос.
Обратный вызов должен возвращать true в случае успешного входа в систему, иначе он не сможет автоматически повторить запрос после успешной аутентификации.
Н!Б! Если вход в систему не работает, но все равно return true
, это может вызвать бесконечный цикл request->login->request->login...
Пример функции входа в систему
static function cb_do_login (){
$ wcurl = wcurl:: instance ();
$ login = $ wcurl -> post ( " /login " , array (
' login ' => ' my_user ' ,
' password ' => ' covfefe ' )
);
if ( $ login [ ' status ' ][ ' http_code ' ]== 200 ){
return true ;
}
// or
$ wcurl -> setOptions ( [ ' basicauth ' => " $ user : $ password " ]);
}
При вызове wcurl::instance()
он возвращается как одноэлементный класс, поэтому в любом месте кода используется один и тот же объект. Чтобы принудительно создать новый экземпляр из класса, используйте что-то вроде
$ apiTwo = new wcurl ([ $ iniName | $ optionsArray ]);
И тогда $apiTwo
можно будет сохранить в кусте F3.
Есть что улучшить, но в настоящее время я буду создавать нужные мне функции. Если что-то невозможно для вашего варианта использования, отправьте сообщение о проблеме или даже сообщите о проблеме. Спасибо разработчикам F3 за этот замечательный фреймворк. Если вы ищете что-то вроде F3-wcurl, но не используете это, подумайте дважды: почему вы еще не используете F3?