Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Premature end of file
Форумы портала PHP.SU » » XML и его обработка » Premature end of file

Страниц (1): [1]
 

1. Proffessional - 19 Мая, 2011 - 09:58:31 - перейти к сообщению
Хочу отправить сообщение с помощью Atom Publishing Protocol. Создаю xml:
PHP:
скопировать код в буфер обмена
  1. $atom = new DOMDocument('1.0', 'UTF-8');
  2.  
  3. $atom_entry = $atom->createElement('entry');
  4. $atom_entry->setAttribute('xmlns', 'http://www.w3.org/2005/Atom');
  5. $atom->appendChild($atom_entry);
  6.  
  7. $atom_title = $atom->createElement('title');
  8. $atom_title->setAttribute('type', 'text');
  9. $atom_entry->appendChild($atom_title);
  10. $atom_title_content = $atom->createTextNode($subject);
  11. $atom_title->appendChild($atom_title_content);
  12.  
  13. $atom_content = $atom->createElement('content');
  14. $atom_content->setAttribute('type', 'xhtml');
  15. $atom_entry_content=$atom->createTextNode($entry);
  16. $atom_content->appendChild($atom_entry_content);
  17. $atom_entry->appendChild($atom_content);
  18.  
  19. $atomMessage = $atom->saveXML();

результат:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Test</title><content type="xhtml">Test!</content></entry>

значит, всё правильно. Отправляю на Blogger.com. Вот что выдаётся -
CODE (htmlphp):
скопировать код в буфер обмена
  1. Content-Type: text/html; charset=UTF-8
  2. Date: Thu, 19 May 2011 06:49:13 GMT
  3. Expires: Thu, 19 May 2011 06:49:13 GMT
  4. Cache-Control: private, max-age=0
  5. X-Content-Type-Options: nosniff
  6. X-XSS-Protection: 1; mode=block
  7. Server: GSE
  8. Transfer-Encoding: chunked
  9.  
  10. Premature end of file.

Ребята, помогите понять, что не так? Почему мой xml, совершенно правильно созданный, оказывается незавершённым? Ниндзя
2. Мелкий - 19 Мая, 2011 - 11:04:09 - перейти к сообщению
Скорее проблема в отправке или получатель требует какие-то ещё поля, кроме титла и контента.
3. Proffessional - 19 Мая, 2011 - 11:08:13 - перейти к сообщению
В документации http://code[dot]google[dot]com/intl/ru/a[dot][dot][dot]ingPublicEntries
пример как раз такой. Я и с тегом category пробовал, результат тот же
CODE (htmlphp):
скопировать код в буфер обмена
  1. <entry xmlns='http://www.w3.org/2005/Atom'>
  2.   <title type='text'>Marriage!</title>
  3.   <content type='xhtml'>
  4.     <div xmlns="http://www.w3.org/1999/xhtml">
  5.       <p>Mr. Darcy has <em>proposed marriage</em> to me!</p>
  6.       <p>He is the last man on earth I would ever desire to marry.</p>
  7.       <p>Whatever shall I do?</p>
  8.     </div>
  9.   </content>
  10.   <category scheme="http://www.blogger.com/atom/ns#" term="marriage" />
  11.   <category scheme="http://www.blogger.com/atom/ns#" term="Mr. Darcy" />
  12. </entry>
4. Мелкий - 19 Мая, 2011 - 11:20:44 - перейти к сообщению
А отправляете как?
5. Proffessional - 19 Мая, 2011 - 11:36:51 - перейти к сообщению
Мелкий пишет:
А отправляете как?

'Content-type: application/atom+xml',
'Content-Length:'.$length,
'Authorization: GoogleLogin auth='.$Cookie,

в post запросе отправляю xml, то есть:
PHP:
скопировать код в буфер обмена
  1. $length = strlen($postBody);
  2. $atomHeader = array(
  3.                                         'Content-type: application/atom+xml',
  4.                                         'Content-Length:'.$length,
  5.                                         'Authorization: GoogleLogin auth='.$Cookie,
  6.                                         );
  7.  
  8. curl_setopt($ch, CURLOPT_URL, 'https://www.blogger.com/feeds/'.$blogID.'/posts/default');
  9. curl_setopt($ch, CURLOPT_HEADER, true);
  10. curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody);
6. Мелкий - 19 Мая, 2011 - 12:23:55 - перейти к сообщению
Ну, а дальше?
Здесь вы только объявили массив из 3 строк, никак их не использовав.

Пошлите данные другому своему скрипту, посмотрите, что и как приходит.
7. Proffessional - 19 Мая, 2011 - 12:47:10 - перейти к сообщению
Мелкий, извините, а как это сделать?
(Добавление)
PHP:
скопировать код в буфер обмена
  1. $atom = new DOMDocument('1.0', 'UTF-8');
  2.  
  3. $atom_entry = $atom->createElement('entry');
  4. $atom_entry->setAttribute('xmlns', 'http://www.w3.org/2005/Atom');
  5. $atom->appendChild($atom_entry);
  6.  
  7. $atom_title = $atom->createElement('title');
  8. $atom_title->setAttribute('type', 'text');
  9. $atom_entry->appendChild($atom_title);
  10. $atom_title_content = $atom->createTextNode($subject);
  11. $atom_title->appendChild($atom_title_content);
  12.  
  13. $atom_content = $atom->createElement('content');
  14. $atom_content->setAttribute('type', 'xhtml');
  15. $atom_entry_content=$atom->createTextNode($entry);
  16. $atom_content->appendChild($atom_entry_content);
  17. $atom_entry->appendChild($atom_content);
  18.  
  19. $atomMessage = $atom->saveXML();
  20.  
  21. echo $atomMessage;
  22.  
  23. echo '<br>';
  24.  
  25. $length = strlen($postBody);
  26. $atomHeader = array(
  27.                                         'Content-type: application/atom+xml',
  28.                                         'Content-Length:'.$length,
  29.                                         'Authorization: GoogleLogin auth='.$Cookie,
  30.                                         );
  31. //stert session!
  32. curl_setopt($ch, CURLOPT_URL, 'https://www.blogger.com/feeds/'.$blogID.'/posts/default');
  33. curl_setopt($ch, CURLOPT_HEADER, true);
  34. curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody);
  35. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  36. curl_setopt($ch, CURLOPT_HTTPHEADER, $atomHeader);
  37. curl_setopt($ch, CURLOPT_VERBOSE, true);
  38. $sendResult = curl_exec($ch);
  39. echo $sendResult;


$Cookie - это auth-token гугла, с ним всё правильно
8. Мелкий - 19 Мая, 2011 - 16:50:21 - перейти к сообщению
CURLOPT_URL заменяете на url какого-то подконтрольного вам скрипта примерно такого содержания:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. var_dump($_POST,apache_request_headers()); // и ещё что-нибудь по вкусу

И смотрите, что вы таки отправили.
9. Proffessional - 19 Мая, 2011 - 18:13:01 - перейти к сообщению
Мелкий, я сделал через httpAnalyzer, получил такой header:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. POST /feeds/2415983713197246636/posts/default HTTP/1.1
  3. Host: www.blogger.com
  4. Accept: */*
  5. Content-type: application/atom+xml
  6. Content-Length:0
  7. Authorization: GoogleLogin auth=DQAAAJUAAADZ3dR9WzxwAw0R0QKjrzJkBJfy8_ErIwsaxuXeIr4yAFX7iVsZePeYb82jScLtoa8xOsPAJrmTZsrvNY5GYzBvUrbBTY9EjrBIRBamCmomOIS9aRi9W41DLBzDIYCb-om0e-6KlDRMcP_fh7FpSkBq3RJua_wDqohscjW-DVDGjFKXtyQ9AwtMZEcfPnmsim4xzAfj39RBSWX09klNm2ux
  8.  

И всё. Растерялся
(Добавление)
Почему-то он не передаёт xml. У!... Я уже столько написал, что мозги путаются в таких простых вещах!..
10. Мелкий - 19 Мая, 2011 - 19:31:09 - перейти к сообщению
Proffessional, нашли ошибку, так понимаю? В CURLOPT_POSTFIELDS передаёте не то, что нужно.
И включите error_reporting в E_ALL | E_STRICT, PHP бы сразу сказал, в чём проблема.
11. Proffessional - 19 Мая, 2011 - 20:11:42 - перейти к сообщению
Извините, я наверное надоедлив.. Теперь post выглядит так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. POST /feeds/2415983713197246636/posts/default HTTP/1.1
  2. Host: www.blogger.com
  3. Accept: */*
  4. Content-type: application/atom+xml
  5. Content-Length:0
  6. Authorization: GoogleLogin auth=DQAAAJYAAADfPLX_-xYsXDmgOevur0msUfr5Gb581EVrPKv6B-3nWebiEGT320RZGKuytWgNfF2wFlhA_DO68kGBpX1U65XW0tOdAGqugoSi4ZfjfHYLns6V4GWHezuOxifLP5adeP33B7UZ8FNmNdv8ATMM8iLgJJcfnLkmVCT6RAx6-SLXnkYotgD8-naT6R1ZxaKzmN1jURNlGcSeE2y1LYRIzPUf
  7.  
  8.  
  9. <?xml version="1.0" encoding="UTF-8"?>
  10. <entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Test</title><content type="xhtml">Test!</content></entry>
Ответ сервера такой же. Теперь уже совсем не понятно в чём проблема...
12. Мелкий - 19 Мая, 2011 - 20:25:46 - перейти к сообщению
Proffessional пишет:
Content-Length:0

Меня вот это несколько смущает.

Ну и покурите поиск гугла, должны быть маны и более развёрнутые и с другими примерами.
13. Proffessional - 19 Мая, 2011 - 21:30:24 - перейти к сообщению
Мелкий пишет:
Proffessional пишет:
Content-Length:0

Меня вот это несколько смущает.

Ну и покурите поиск гугла, должны быть маны и более развёрнутые и с другими примерами.

Исправил. Теперь пришёл к изначальной ошибке, первой из всей этой череды:
CODE (htmlphp):
скопировать код в буфер обмена
  1. The processing instruction target matching "[xX][mM][lL]" is not allowed.

Как я знаю, это сообщение выводит Java когда перед открытием xml есть что-то ещё, хоть один пробел. Но здесь его нету (я же не зря использовал new DOMDocument?). Что же это может быть?

Да, извините, мне никак не повысить Вам репутацию, не разрешают Ниндзя

 

Powered by ExBB FM 1.0 RC1