【问题标题】:How to make redirect for API POST call request works exactly same like HTML POST request如何使 API POST 调用请求的重定向与 HTML POST 请求完全相同
【发布时间】:2019-02-27 23:30:40
【问题描述】:

下面是我使用 curl 的代码,它不像 HTML 表单那样真正重定向:

$curl =  new \Curl\Curl();
        $curl->setHeader('Content-Type', 'application/x-www-form-urlencoded');
        $curl->setOpt(CURLOPT_FOLLOWLOCATION,true);
        $curl->setOpt(CURLOPT_POST,true);
        $curl->setOpt(CURLOPT_RETURNTRANSFER,true);
        $curl->post('http://localpay.sample.test/make-payment',$params);

大家好,
以上是我使用 php package : curl/curl 制作的示例代码,
不过不用担心,我期待任何答案,使用纯 curl 的答案也可以,任何其他答案也可以,只要它使用 php 语言即可。

我想要实现的是如何进行 API 调用的工作方式与 HTML 表单完全相同。为什么我要实现这一目标?因为在 HTML 表单中我们需要点击提交按钮,我知道 javascript 可以触发,但我正在尝试使用完全后端语言构建自己的包。

我已经尝试在互联网上搜索问题,但没有一个是我所期望的。

下面是我的简单 html 表单,它确实重定向到所需的 url:

<form id="payment_confirmation" action="http://localpay.sample.test/make-payment" method="post"/>

   Payer ID : <input type="text" name="payer_acc_id"><br>
   Payee ID : <input type="text" name="payer_acc_id"><br>
   <input type="hidden" name="signature" value="somePhpFunction()">

    <button type="submit" value="Submit"> Submit</button>

</form>

以上是示例工作 HTML 表单,它重定向到该操作 url 路径,但在 curl 中我无法实现它,所以我如何通过使用 curl 或任何其他方式来实现它。

【问题讨论】:

  • 因此浏览器向您的 PHP 发出请求,从而向 localpay 发出请求。本地支付重定向。您的代码应该使 PHP 自动遵循请求。还是你问如何让浏览器访问curl重定向到的URL?
  • Quentin,html 表单工作正常,但是 curl 发生的事情是它没有重定向到预期的 url 路径
  • 是什么让你认为 cURL 没有被重定向?
  • 我的浏览器没有重定向到预期的 url,而 HTML 表单确实将浏览器重定向到了预期的 url
  • 为什么要重定向浏览器?请求是由 PHP/cURL 发出的,而不是浏览器。您的 PHP 代码中没有 header("location: ...") 调用,因此您没有告诉浏览器转到不同的 URL。

标签: php html laravel curl


【解决方案1】:

设置Content-Type 标头并不规定 curl 将使用哪种格式来发送发布数据。如果您给 CURLOPT_POSTFIELDS 一个数组,那么 curl 将使用 multipart/form-data 格式发送数据,无论您在 Content-Type 标头中放入什么内容。很可能您的 curl 代码以 Multipart/form-data 格式发送数据,而 $params 是一个数组,并且因为您告诉服务器 this is application/x-www-form-urlencoded,服务器会将 multipart/form-data 数据解析为 application/x-www-form-urlencoded, (这是一种完全不兼容的格式),并且根本不理解数据。如果您想将一个帖子数据数组转换为application/x-www-form-urlencoded-格式,请使用http_build_query 函数,例如

    $curl->post('http://localpay.sample.test/make-payment',http_build_query($params));

【讨论】:

    【解决方案2】:

    我使用 curl 找到了 POST 重定向的答案:

    $params = ['payee_id' => 1 , 'amount' => 300];
    
    $curl = curl_init('http://someurl.com/silent/pay');
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));    
            curl_exec($curl);
    

    curl 将遵循 POST 方法的重定向,如果你们想要更多解释,请转到 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多