Laravel 4 отправляет запрос от контроллера на внешний URL с данными

Я ищу способ сделать почтовый запрос от контроллера внешним 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 больше. Спасибо.

Ответ 1

Позвольте мне прояснить некоторые вещи и попытаться указать вам в правильном направлении.

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

  • Вы можете сделать запрос API в любом месте своего приложения, не обязательно в своем контроллере (не бойтесь делать дополнительные классы/модели для таких вещей, как вызовы API!)
  • Мне интересно, почему это "должно быть" сделано в вашем контроллере? Какой ваш вариант использования?
  • AJAX не существует на стороне сервера (в PHP). Это чисто специфическая javascript "технология", которая описывает javascript, создавая запрос на URL-адрес на стороне клиента.

Наконец, что вы пытаетесь сделать? Вам нужен пользователь для перенаправления? Или вам нужно сделать вызов API и проанализировать результат в своем приложении?

Запрошенный запрос cURL должен работать для создания запроса API. Это один из основных способов сделать запрос API в PHP-коде. Однако он не позволит пользователю в интерфейсе видеть, что запрос выполняется и обрабатывается. С cURL (и любым запросом API) обработка происходит за кулисами вашего PHP (которые ваши пользователи не видят).

Ответ 2

Мы можем использовать пакет Guzzle в Laravel, это HTTP-клиент PHP для отправки HTTP-запросов.

Вы можете установить Guzzle через композитор

composer require guzzlehttp/guzzle:~6.0

Или вы можете указать Guzzle как зависимость в вашем проекте, существующий composer.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);

}

Ответ 3

Используйте CURL так, как вы пытались, или посмотрите этот поток для краткого ответа на это с помощью http-клиента Guzzle. Кажется, что Guzzle является предпочтительным клиентом для использования с Laravel...

Вызывать внешнюю функцию API от контроллера, LARAVEL 4