【问题标题】:sending xml and headers via curl通过 curl 发送 xml 和 headers
【发布时间】:2012-03-04 06:36:28
【问题描述】:

想知道如何通过 php 在 curl 会话中设置所有这些数据:

POST /feeds/api/users/default/uploads HTTP/1.1
Host: uploads.gdata.youtube.com
Authorization: AuthSub token="DXAA...sdb8"
GData-Version: 2
X-GData-Key: key=adf15ee97731bca89da876c...a8dc
Slug: video-test.mp4
Content-Type: multipart/related; boundary="f93dcbA3"
Content-Length: 1941255
Connection: close

--f93dcbA3
Content-Type: application/atom+xml; charset=UTF-8

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom"
  xmlns:media="http://search.yahoo.com/mrss/"
  xmlns:yt="http://gdata.youtube.com/schemas/2007">
  <media:group>
    <media:title type="plain">Bad Wedding Toast</media:title>
    <media:description type="plain">
      I gave a bad toast at my friend's wedding.
    </media:description>
    <media:category
      scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People
    </media:category>
    <media:keywords>toast, wedding</media:keywords>
  </media:group>
</entry>
--f93dcbA3
Content-Type: video/mp4
Content-Transfer-Encoding: binary

<Binary File Data>
--f93dcbA3--

我不明白为什么会有一些标题,然后--f93dcbA3 更多标题(边界是什么?),一些 xml(为什么在这里?),更多标题和文件内容。

我知道如何在没有xml 部分和“边界”的情况下提出请求。

任何帮助将不胜感激:D

【问题讨论】:

    标签: php curl http-headers


    【解决方案1】:

    边界是必需的,因为表单 enctype 是 multipart/form-data,而不是在本例中是 multipart/related。边界是一个唯一的字符串,不能出现在请求的其他任何地方,它用于将每个元素与表单分开,无论是文本输入的值,还是文件上传的值。每个边界都有自己的内容类型。

    Curl 无法为您执行 multipart/related,因此您需要使用解决方法,请参阅 curl 邮件列表中的 this message 以获取建议。基本上,您必须自己构建大部分消息。

    注意,最后一个边界的末尾有一个额外的--

    此代码有望帮助您入门:

    <?php
    
    $url       = 'http://uploads.gdata.youtube.com/feeds/api/users/default/uploads';
    $authToken = 'DXAA...sdb8'; // token you got from google auth
    $boundary  = uniqid();      // generate uniqe boundary
    $headers   = array("Content-Type: multipart/related; boundary=\"$boundary\"",
                       "Authorization: AuthSub token=\"$authToken\"",
                       'GData-Version: 2',
                       'X-GData-Key: key=adf15....a8dc',
                       'Slug: video-test.mp4');
    
    $postData  = "--$boundary\r\n"
                ."Content-Type: application/atom+xml; charset=UTF-8\r\n\r\n"
                .$xmlString . "\r\n"  // this is the xml atom data
                ."--$boundary\r\n"
                ."Content-Type: video/mp4\r\n"
                ."Content-Transfer-Encoding: binary\r\n\r\n"
                .$videoData . "\r\n"  // this is the content of the mp4
                ."--$boundary--";
    
    
    $ch  = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
    $response = curl_exec($ch);
    curl_close($ch);
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2012-08-15
      • 1970-01-01
      • 2017-10-14
      相关资源
      最近更新 更多