интересно, как я могу установить все эти данные в curl-сессии, используя php:
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
Граница требуется, поскольку форма enctype является multipart/form-data
, а в этом случае multipart/related
. Граница – это уникальная строка, которая не может появляться в другом месте в запросе и используется для разделения каждого элемента из формы, будь то значение текстового ввода или загрузка файла. Каждая граница имеет свой собственный контент-тип.
Curl не может использовать multipart/related
для вас, поэтому вам нужно будет использовать обходной путь, см. Это сообщение из списка раскручиваемых списков для предложений. В принципе, вам придется самому сконструировать большую часть сообщения.
Обратите внимание: последняя граница имеет дополнительный --
в конце.
Этот код, надеюсь, поможет вам начать:
<?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);
Надеюсь, это поможет.