11

我正在寻找一种从控制器向外部 url 发出发布请求的方法。发布的数据是一个 php 数组。要接收的 url 是外部 url 中的电子商务 API。帖子必须从控制器方法完成。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 答案。谢谢你。

4

3 回答 3

8

我们可以在 Laravel 中使用 Guzzle 包,它是一个用于发送 HTTP 请求的 PHP HTTP 客户端。

您可以通过 composer 安装 Guzzle

composer require guzzlehttp/guzzle:~6.0

或者您可以将 Guzzle 指定为项目现有 composer.json 中的依赖项

{
   "require": {
      "guzzlehttp/guzzle": "~6.0"
   }
}

laravel中POST请求的示例代码,使用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);

}

于 2015-09-14T16:48:22.213 回答
7

让我澄清一些事情并尝试为您指明正确的方向。

首先,您尝试做的事情听起来像是“从您的网络应用程序发出 API 请求”。我的表述方式与您的表述方式的不同之处在于它更笼统。

  1. 您可以在应用程序中的任何位置发出 API 请求,不一定在控制器中(不要害怕为 API 调用等创建额外的类/模型!)
  2. 我很好奇为什么它“必须”在你的控制器中完成?你的用例是什么?
  3. 服务器端不存在 AJAX(在 PHP 中)。这纯粹是一种特定于 javascript 的“技术”,它描述了 javascript 在客户端向 URL 发出请求。

最后,你想做什么?您需要重定向用户吗?或者您是否需要进行 API 调用并在应用程序中解析结果?

您尝试的 cURL 请求应该适用于发出 API 请求。这是在 PHP 代码中发出 API 请求的主要方式之一。但是,它不允许前端的用户看到正在发出和处理的请求。使用 cURL(和任何 API 请求),处理都在 PHP 的幕后进行(您的用户看不到)。

于 2013-09-12T17:31:23.560 回答
2

要么按照您一直在尝试的方式使用 CURL,要么查看此线程以获取有关使用 Guzzle http 客户端执行此操作的简要答案。Guzzle 似乎是与 Laravel 一起使用的首选客户端......

从控制器调用外部 API 函数,LARAVEL 4

于 2014-07-08T05:59:54.933 回答