【问题标题】:Post HTML content via cURL通过 cURL 发布 HTML 内容
【发布时间】:2013-04-22 12:51:04
【问题描述】:

我有以下代码:

$poststr = "param1=<html><head></head><body>test1 & test2</body></html>&param2=abcd&param3=eeee";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://www.mytest.com");
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $poststr);
curl_setopt($curl, CURLOPT_ENCODING, "");
$curlData = curl_exec($curl);

帖子不起作用,我猜这与 param1 中包含 HTMl 的事实有关。但如果我使用htmlentities(),它就无济于事了。我试过使用urlencode(),但还是不行。

【问题讨论】:

  • 试试htmlentities_encode?​​span>
  • 把它当作一个数组试试。 $post['param1']='&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;test1 &amp; test2&lt;/body&gt;&lt;/html&gt;';等..
  • @Waygood 我需要设置这个吗? curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
  • 你到底为什么要这样做?无论如何,问题是未编码的&符号。将数据构造为数组并通过http_build_query() 传递。您可以将数组直接传递给 cURL,但这样做会导致请求正文大于严格要求的内容(cURL 将其编码为 multipart/form-data)。这可以说无关紧要,但我个人更喜欢控制发送到远程服务器的确切正文字符串。
  • @user838437 问题/评论是关于将 HTML 发送到另一台服务器的一般做法。一般来说,您应该发送编码形式所代表的数据,而不是编码形式。如果 HTML is 是数据,那很好 - 但这种情况很少见。无论哪种方式,每当你做这样的事情时,你应该使用一个数组和http_build_query() - 它保证每次都能正确地转义,而且通常更容易使用

标签: php curl


【解决方案1】:

不要忘记&amp; 是一个特殊的 URL 分隔符。
在您的示例中,&lt;body&gt;test1 &amp; test2&lt;/body&gt; 被解释错误。
$poststr 必须仔细进行 urlencoded。这是正确的方法:

$poststr = "param1=".rawurlencode('<html><head></head><body>test1 & test2</body></html>')."&param2=abcd&param3=eeee";

您应该对它的所有部分进行编码:param2 和 param3。
最简单的方法是使用数组和html_build_query():

$params = array();
$params['param1'] = '<html><head></head><body>test1 & test2</body></html>';
$params['param2'] = 'abcd';
$params['param3'] = 'eeee';

//or
//$params = array( 'param1' => '<html><head></head><body>test1 & test2</body></html>',
//                 'param2' => 'abcd',
//                 'param3' => 'eeee'
//               );

$poststr = html_build_query($params);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://www.mytest.com");
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $poststr);
curl_setopt($curl, CURLOPT_ENCODING, "");
$curlData = curl_exec($curl);

【讨论】:

  • 我用过这个。但它正在剥离内联样式标签。我需要它,因为我正在使用它来发送 html 电子邮件。
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多