带有标题和XML内容的PHP帖子

时间:2014-03-16 20:20:47

标签: php post youtube header gdata

我想通过PHP通过GData API订阅YouTube频道。

Documentation

我如何在PHP中发帖?

我尝试了这样,但页面一直在加载:

<?php

session_start();

include 'gdata.php' // For $DEVKEY

function post_xml($url, $xml) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, true);
  curl_setopt($ch, CURLINFO_HEADER_OUT, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, Array(
  "Content-Type: application/atom+xml",
  "Content-Length: 1024",
  "Authorization: Bearer $token",
  "GData-Version: 2",
  "X-GData-Key: key=$DEVKEY"));
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, array('data' => $xml );
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

  $result = curl_exec($ch);
  $info = curl_getinfo($ch);
  curl_close($ch);
  return $result;
}    

$token = $_SESSION['token'];

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
  xmlns:yt="http://gdata.youtube.com/schemas/2007">
    <category scheme="http://gdata.youtube.com/schemas/2007/subscriptiontypes.cat"
      term="channel"/>
    <yt:username>GoogleDevelopers</yt:username>
</entry>';

$url = 'https://gdata.youtube.com/feeds/api/users/default/subscriptions';

echo post_xml($url, $xml);

?>

在HttpRequester中我已经设法做了一个HTTP Post Request并且它有效。我认为问题是请求的内容。如何通过PHP(cURL)正确地给出“内容”中的文本(查看截图)?

HttpRequester

谢谢:)

2 个答案:

答案 0 :(得分:1)

只需将$xml作为POSTFIELDS,它就应该有效:

curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

并添加正确的内容长度:

"Content-Length: ".strlen($xml),

当您计划进行更多操作时,例如PUT请求包含数据和大量REST请求,我建议使用某种类型的包Httpful。 Curl有它的陷阱......

答案 1 :(得分:0)

您可以查看下面的代码,希望它有所帮助

 $headers = array(
        "Content-type: text/xml",
        "Content-length: " . strlen($xml),
        "Connection: close",
    );

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $res = curl_exec($ch);
    curl_close($ch);

    return json_decode($res);