Вопрос или проблема
Мы разрабатываем плагин для WordPress и нам требуется API-вызов.
Мы используем API: http://www.geoplugin.net/json.gp?ip=8.8.8.8
В этом контексте:
$response = wp_remote_get("http://www.geoplugin.net/json.gp?ip={$ip}", array(
'timeout' => 45,
'redirection' => 5,
'user-agent' => 'Mozilla/5.0 (совместимо; Rigor/1.0.0; http://rigor.com)',
));
$dataArray = json_decode(wp_remote_retrieve_body($response));
var_dump($response);
Однако, все, что мы получаем – это ошибка 403:
string(162) "
403 Forbidden
nginx
"
API-вызов работал нормально с использованием этого кода:
file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}")
Тем не менее, WordPress позволяет нам использовать только wp_remote_get()
.
Мы уже долго пытаемся решить эту проблему, но не можем её исправить или найти решение. Мы даже пытались добавить аргумент user-agent, чтобы сделать запрос похожим на подключение из браузера, но это тоже не помогло.
Кто-нибудь знает, как решить эту проблему?
Спасибо, что уделили время!
Редактировать:
Пример ожидаемого ответа:
{
"geoplugin_request":"8.8.8.8",
"geoplugin_status":206,
"geoplugin_delay":"2ms",
"geoplugin_credit":"Некоторые возвращенные данные включают данные GeoLite, созданные MaxMind, доступные по <a href="http:\/\/www.maxmind.com">http:\/\/www.maxmind.com<\/a>.",
"geoplugin_city":"",
"geoplugin_region":"",
"geoplugin_regionCode":"",
"geoplugin_regionName":"",
"geoplugin_areaCode":"",
"geoplugin_dmaCode":"",
"geoplugin_countryCode":"US",
"geoplugin_countryName":"Соединенные Штаты",
"geoplugin_inEU":0,
"geoplugin_euVATrate":false,
"geoplugin_continentCode":"NA",
"geoplugin_continentName":"Северная Америка",
"geoplugin_latitude":"37.751",
"geoplugin_longitude":"-97.822",
"geoplugin_locationAccuracyRadius":"1000",
"geoplugin_timezone":"",
"geoplugin_currencyCode":"USD",
"geoplugin_currencySymbol":"$",
"geoplugin_currencySymbol_UTF8":"$",
"geoplugin_currencyConverter":1
}
Почему у вас там фигурные скобки?
Возможно, сначала обработайте строку запроса с помощью htmlspecialchars(
). Ошибка указывает на нестандартные символы…что и делает ваша фигурная скобка.
Сформируйте строку запроса с значением $ip, преобразуйте с помощью htmlspecialchars()
, затем добавьте URL в строку запроса. Передайте эту переменную в функцию wp_remote_get()
.
Ответ или решение
При использовании функции wp_remote_get()
в WordPress для выполнения API-запроса вы столкнулись с ошибкой 403, в то время как функция file_get_contents()
работает без проблем. Эта ситуация может возникать по нескольким причинам, и мы можем рассмотреть некоторые решения.
Причины ошибки 403
-
Проблемы с User-Agent: Некоторые API-сервисы проверяют
User-Agent
, чтобы разрешить или запретить доступ к своим ресурсам. Ваша попытка указатьUser-Agent
, похожий на браузер, может быть недостаточной. -
Куки и сессии: Некоторые API могут требовать наличие определенных куки или сессионных данных, которые могут быть переданы через
wp_remote_get()
. -
Формат URL: Обратите внимание на то, как формируется ваш URL. Если происходит какое-либо дополнительное экранирование или кодирование символов, это может привести к неправильному формированию запроса.
Решение проблемы
Вот несколько шагов, которые вы можете предпринять для решения этой проблемы.
-
Убедитесь, что IP правильно передается:
Прежде всего, убедитесь, что переменная$ip
корректно передается в строку запроса без дополнительных символов или пробелов. Попробуйте использовать функциюesc_url()
для экранирования адреса:$ip = '8.8.8.8'; // Пример IP, используйте ваше значение $url = esc_url("http://www.geoplugin.net/json.gp?ip={$ip}");
-
Широкий User-Agent:
Попробуйте использовать более распространенныйUser-Agent
, например, от браузера Chrome:$response = wp_remote_get($url, array( 'timeout' => 45, 'redirection' => 5, 'headers' => array( 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' ) ));
-
Проверка кэша:
Возможно, что у вас есть кэширование запросов, которое влияет на ваш ответ. Попробуйте временно отключить кэширование, если оно используется. -
Отладка и диагностика:
Для диагностики вы можете использовать следующие команды для получения детальной информации о запросе:if (is_wp_error($response)) { $error_message = $response->get_error_message(); echo "Ошибка: $error_message"; } else { $dataArray = json_decode(wp_remote_retrieve_body($response), true); var_dump($dataArray); }
-
Проверка на стороне сервера:
Если все еще получаете 403, возможно, необходимо обратиться к документацииgeoplugin
или в их службу поддержки, чтобы убедиться, что ваш IP-адрес или интересующий вас ресурс не заблокирован. -
Опережающее обращение:
Попробуйте добавить задержку между запросами или использовать функцию для выполнения запроса только один раз, если это допустимо.
Если все описанные выше шаги не помогли, возможно, стоит вернуться к file_get_contents()
или рассмотреть возможность использования сторонней библиотеки (если это возможно в рамках вашего проекта). Однако необходимо помнить, что wp_remote_get()
рекомендуется использовать в контексте разработки под WordPress, так как она обеспечивает более высокую совместимость с функционалом платформы.
Надеюсь, эти шаги помогут вам разрешить возникшую проблему с запросами API! Если у вас есть дополнительные вопросы, пожалуйста, дайте знать.