Laravel 4 使用数据从控制器向外部 url 发出 post 请求
Posted
技术标签:
【中文标题】Laravel 4 使用数据从控制器向外部 url 发出 post 请求【英文标题】:Laravel 4 make post request from controller to external url with data 【发布时间】:2013-09-17 04:32:26 【问题描述】:我正在寻找一种从控制器向外部 url 发出 post 请求的方法。发布的数据是一个 php 数组。要接收的 url 是外部 url 中的电子商务 API。帖子必须从控制器方法完成。 url 应以“success”、“error”、“failure”或“trylater”字符串回复。我尝试了以下方法但没有成功:
return Redirect::to("https://backoffice.host.iveri.com/Lite/Transactions/New/Authorise.aspx", compact($array));
我也试过 curl:
$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】:我们可以在 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);
【讨论】:
这比Curl
或get_file_contents()
好吗?【参考方案2】:
要么按照您一直在尝试的方式使用 CURL,要么查看此线程以获取有关使用 Guzzle http 客户端执行此操作的简要答案。 Guzzle 似乎是与 Laravel 一起使用的首选客户端......
Call external API function from controller, LARAVEL 4
【讨论】:
【参考方案3】:让我澄清一些事情并尝试为您指明正确的方向。
首先,您尝试执行的操作听起来像是“从您的网络应用发出 API 请求”。我的表述方式与您的表述方式的不同之处在于它更笼统。
-
您可以在应用程序的任何位置发出 API 请求,而不必在控制器中(不要害怕为 API 调用之类的事情创建额外的类/模型!)
我很好奇为什么它“必须”在您的控制器中完成?您的用例是什么?
服务器端不存在 AJAX(在 PHP 中)。这纯粹是一种特定于 javascript 的“技术”,它描述了 javascript 在客户端向 URL 发出请求。
最后,你想做什么?您需要重定向用户吗?或者您是否需要在应用程序中进行 API 调用并解析结果?
您尝试的 cURL 请求应该用于发出 API 请求。这是在 PHP 代码中发出 API 请求的主要方式之一。但是,它不允许前端的用户看到正在发出和处理的请求。使用 cURL(和任何 API 请求),所有处理都在 PHP 的幕后进行(您的用户看不到)。
【讨论】:
谢谢。它必须从控制器完成,因为提交您的登录详细信息的同一表单会提交信用卡详细信息。所以我必须验证输入,让你登录,然后在你点击提交后进行交易和接收,评估和保存 API 响应。我怎样才能使它更简单? 抱歉,API 必须通过将用户重定向到定义的 URL 之一来响应,检查我编辑的问题的底部。 酷 - 我认为唯一的问题是询问您的 cURL 请求的结果是什么?出乎意料的事情?您确定他们的 API 不希望您通过表单 POST 请求将您的用户发送到他们的网站吗? (而不是 API 调用?) 是的,他们希望提交表单,但发布的方式与我通过 API 调用发布数组的方式相同,对吧?我决定使用“return Redirect::to($url.'?'.http_build_query($array));”我被重定向到一个显示“指定的返回 URL 无效”的页面,这意味着我可能从错误的环境进行测试。我现在无法在正确的 https 实时环境上进行测试。我不确定通过 https 这样做是否安全,因为它会显示 url 字符串上的交易详细信息...... 对此有任何答案吗?与 iveri 和 laracwl 有完全相同的问题以上是关于Laravel 4 使用数据从控制器向外部 url 发出 post 请求的主要内容,如果未能解决你的问题,请参考以下文章