Laravel 4 делает запрос post от контроллера к внешнему url с данными
Я ищу способ сделать запрос post от контроллера к внешнему url-адресу. Публикуемые данные представляют собой массив php. Url-адрес для получения-это API электронной коммерции во внешнем url-адресе. Сообщение должно быть сделано из метода контроллера. Url-адрес должен отвечать строкой "success", "error", "failure" или "trylater". Я попробовал следующее без успеха:
return Redirect::to("https://backoffice.host.iveri.com/Lite/Transactions/New/Authorise.aspx", compact($array));
Я тоже пробовал завить:
$url = 'https://backoffice.host.iveri.com/Lite/Transactions/New/Authorise.aspx';
//url-ify the data for the POST
$fields_string ='';
foreach($array as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'& ');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($array));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
часть отправляемого массива-это обратные вызовы, которые API использует для ответа:
'Lite_Website_Successful_url' => 'https://mydomain.com/order/'.$order_id,
'Lite_Website_Fail_url' => 'https://mydomain.com/checkout/fail',
'Lite_Website_TryLater_url' => 'https://mydomain.com/checkout/trylater',
'Lite_Website_Error_url' => 'https://mydomain.com/checkout/error'
пожалуйста, дайте мне знать, как правильно сделать запрос POST с данными, перенесенными с ним на внешний url. Сообщение ajax от контроллера тоже помогло бы, но я попытался без успеха. Но я бы предпочел ответ laravel php больше. Спасибо.
3 ответов
позвольте мне прояснить некоторые вещи и пытаюсь указать вам в правильном направлении.
во-первых, то, что вы пытаетесь сделать, звучит как "создание запроса API из вашего веб-приложения". Разница в этой формулировке в том, как я ее сформулировал против вашей, заключается в том, что она более общая.
- вы можете сделать запрос API в любом месте вашего приложения, не обязательно в вашем контроллере (не бойтесь делать дополнительные классы/модели для таких вещей, как вызовы API!)
- Я любопытно, почему это "должно быть" сделано в контроллере? Какой у тебя прецедент?
- AJAX не существует на стороне сервера (в PHP). Это чисто специфичная для javascript "технология", которая описывает javascript, делающий запрос на URL-адрес на стороне клиента.
наконец, что вы пытаетесь сделать? Вам нужен пользователь для перенаправления? Или вам нужно сделать вызов API и проанализировать результат в вашем приложении?
завиток запрос вы пытались должны работа для создания запроса API. Это один из основных способов сделать запрос API в PHP-коде. Однако это не позволит пользователю на интерфейсе видеть, что запрос выполняется и обрабатывается. С cURL (и любым запросом API) обработка происходит за кулисами в вашем PHP (который ваши пользователи не могут видеть).
мы можем использовать пакет Guzzle в Laravel, это PHP HTTP-клиент для отправки HTTP-запросов.
вы можете установить жрать через composer
composer require guzzlehttp/guzzle:~6.0
или вы можете указать Guzzle как зависимость в существующем композиторе вашего проекта.в JSON
{
"require": {
"guzzlehttp/guzzle": "~6.0"
}
}
пример кода запроса POST в laravel, используя Guzzle, как показано ниже,
use GuzzleHttp\Client;
class yourController extends Controller {
public function saveApiData()
{
$client = new Client();
$res = $client->request('POST', 'https://url_to_the_api', [
'form_params' => [
'client_id' => 'test_id',
'secret' => 'test_secret',
]
]);
$result= $res->getBody();
dd($result);
}
либо используйте CURL так, как вы пытались, либо проверьте этот поток для краткого ответа на это с помощью http-клиента Guzzle. Guzzle кажется предпочтительным клиентом для использования с Laravel...