【问题标题】:Posting JSON using CURL then go to the posted page使用 CURL 发布 JSON 然后转到发布的页面
【发布时间】:2011-11-05 17:11:28
【问题描述】:

我有一组 php 处理页面,它们通过 get 传递数据来进行交互,但现在我必须在几个处理页面之间传递 JSON,并且需要与使用 GET 时相同的功能。

当前工作的get方法:

//The guts

header("Location: $moreprocessing_url/?userid=$id");

exit();

然后在moreprocessing_url中接:

$userid = $_GET[id];

//More guts

$something = 'important';

header("Location: $public_url/?something=$something");

exit();

所以现在在第一个处理页面中,我需要发送 JSON,而不是发送简单的字符串 - 所以我使用 CURL 来发布 JSON - 但是在发布之后我希望被发布的页面继续处理并停止原始页面。上述代码的工作方式相同,但使用 CURL/post 代替。可能是我对 CURL 的理解不够深入,这是不可能的?

我的卷曲:

$curl = curl_init($moreprocessing_url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
curl_setopt($curl, CURLOPT_HTTPHEADER,
array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

curl_exec($curl);
curl_close($curl);

exit();

所以这会返回到发生 CURL 的当前页面,而不是我想要的 moreprocessing_url - 这可能吗?基本上我希望被发布的页面接管并停止发送 CURL 的页面。

【问题讨论】:

  • 如果只是将数据从一个页面传递到另一个页面,你不能只使用会话吗? $id 变量(或您的 JSON)永远不会访问浏览器。
  • 这些 php 处理页面是从另一种执行会话 id 管理的语言调用的,所以试图避免这种情况..?
  • Salman A- 我认为会话是用来管理当前 Web 应用用户的会话 ID 的——我可以像上面的例子那样只使用会话来传递数据吗?
  • 你是对的,在这种情况下会话将不起作用。

标签: php json curl


【解决方案1】:

我相信您正在尝试这样做:

  1. 浏览器要求 guts.php
  2. guts.php 将 JSON 编码的数据发布到 more-guts.php
  3. more-guts.php 处理发布的 JSON 并返回 301 临时移动 响应;新位置是 public.php?something=important
  4. guts.php 接收此响应并将其中继到浏览器
  5. 浏览器跟随重定向

如果这是真的,那么您几乎不需要对 cURL 脚本进行调整。大致如下:

$curl = curl_init("url.php"); // the URL that processes your POST

curl_setopt($curl, CURLOPT_POST, true); // use POST method
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/json")); // set POST header
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // set POST body

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // send output to a variable for processing
curl_setopt($curl, CURLOPT_HEADER, true); // set to true if you want headers in the output
curl_setopt($ch, CURLOPT_NOBODY, true); // set to true if you do not want the body
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // set to false if you want to see what redirect header was sent

$output = curl_exec($curl);
curl_close($curl);

var_dump($output);

根据用于CURLOPT_HEADERCURLOPT_NOBODY 的值,$output 变量将包含响应标头、正文或两者(它们由两个空行分隔)。如果你想从 header 中获取一些东西,你可以使用正则表达式来提取所需的 header 并将其发送到浏览器。

或者,如果您选择这样做,您可以呼应正文。

【讨论】:

  • 好的,我明白了,并进行了测试并使其正常工作。现在如果在您的示例中:guts.php 将 {foo:bar} 发布到 public.php?我可以在 curl 之后 exit() - 让我的 curl 加载 public.php 吗?
  • 我猜这个问题的最简单形式是:如何将 {foo:bar} 从我的 guts.php 处理页面获取到我可以分解 JSON 并显示的公共页面(我我想我会使用 jQuery 或其他东西)。
  • 我接受了,因为您确实正确回答了我的问题,并且我得到了它的工作 - 谢谢。但是您对如何从我的 php 处理页面获取(传递数据)JSON 到面向公众的页面有任何见解吗?
  • @bMon:抱歉我没有早点回复。 cURL 允许您将数据从您的页面发布到服务器端的任何其他页面。这也意味着在服务器端接收到 POST(标头和正文)的响应。从那时起,您可以决定如何处理它。您可以将标头转发到浏览器 - 或者 - 您可以捕获正文并将其发送到浏览器。
  • 续:在上面的示例中,目标 url 将是您的公共页面。 CURLOPT_NOBODYCURLOPT_FOLLOWLOCATIONCURLOPT_HEADER 变得不必要(因为您不再对 Location 标头感兴趣),只需回显您的公共页面返回的内容即可。这种技术有时被称为服务器端代理脚本。
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 2012-11-08
  • 2016-12-16
  • 1970-01-01
  • 2011-12-19
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多