问题 Laravel 4使用数据从控制器向外部URL发出请求


我正在寻找一种方法来从控制器发送一个发布请求到外部URL。发布的数据是一个php数组。要接收的网址是外部网址中的电子商务API。帖子必须从控制器方法完成。该网址应回复“成功”,“错误”,“失败”或“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数据带到外部网址。来自控制器的ajax帖子也会有所帮助,但我尝试过没有成功。但我更喜欢laravel php的答案。谢谢。


11358
2017-09-12 16:57


起源



答案:


让我澄清一些事情,并试着指出你正确的方向。

首先,您尝试执行的操作听起来像“从您的网络应用程序发出API请求”。我对你的说法的措辞不同之处在于它更为通用。

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

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

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


6
2017-09-12 17:31



谢谢。它必须从控制器完成,因为提交您的登录详细信息的相同表单提交信用卡详细信息。所以我必须验证输入,登录后再进行交易和接收,评估并在点击提交后保存API响应。我怎么能让它变得更简单? - TechyTimo
抱歉,API必须通过将用户重定向到其中一个已定义的网址来检查我编辑过的问题的底部。 - TechyTimo
很酷 - 我认为唯一的问题是询问你的cURL请求的结果是什么?出乎意料吗?您确定他们的API不期望您通过表单POST请求将您的用户发送到他们的网站吗? (而不是API调用?) - fideloper
是的,他们希望表单提交,但是我发布的方式与发布API调用的数组相同,对吧?我决定使用“return Redirect :: to($ url。'?'。http_build_query($ array));”我被重定向到一个页面,上面写着“指定了无效的返回URL”,这意味着我可能会从错误的环境中进行测试。我现在无法测试正确的https实时环境。我不确定是否可以通过https来实现这一点,因为它显示了url字符串上的交易详情.... - TechyTimo
对此有何回答?与iveri和laracwl有完全相同的问题 - Ben A. Hilleli


答案:


让我澄清一些事情,并试着指出你正确的方向。

首先,您尝试执行的操作听起来像“从您的网络应用程序发出API请求”。我对你的说法的措辞不同之处在于它更为通用。

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

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

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


6
2017-09-12 17:31



谢谢。它必须从控制器完成,因为提交您的登录详细信息的相同表单提交信用卡详细信息。所以我必须验证输入,登录后再进行交易和接收,评估并在点击提交后保存API响应。我怎么能让它变得更简单? - TechyTimo
抱歉,API必须通过将用户重定向到其中一个已定义的网址来检查我编辑过的问题的底部。 - TechyTimo
很酷 - 我认为唯一的问题是询问你的cURL请求的结果是什么?出乎意料吗?您确定他们的API不期望您通过表单POST请求将您的用户发送到他们的网站吗? (而不是API调用?) - fideloper
是的,他们希望表单提交,但是我发布的方式与发布API调用的数组相同,对吧?我决定使用“return Redirect :: to($ url。'?'。http_build_query($ array));”我被重定向到一个页面,上面写着“指定了无效的返回URL”,这意味着我可能会从错误的环境中进行测试。我现在无法测试正确的https实时环境。我不确定是否可以通过https来实现这一点,因为它显示了url字符串上的交易详情.... - TechyTimo
对此有何回答?与iveri和laracwl有完全相同的问题 - Ben A. Hilleli


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

你可以通过作曲家安装Guzzle

composer require guzzlehttp/guzzle:~6.0

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

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

使用Guzzle的laravel中POST请求的示例代码如下所示,

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);

}


7
2017-09-14 16:48





要么像你一直尝试的那样使用CURL,要么检查这个帖子,以便用Guzzle http客户端做一个简短的回答。 Guzzle似乎是与Laravel一起使用的首选客户端...

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


2
2017-07-08 05:59