Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Epic PHP #7

Roma
March 20, 2014

Epic PHP #7

Слайды к седьмому занятию курса Epic PHP (http://epixx.ru/epic-php/).
Темы: xml, json, curl, API

Roma

March 20, 2014
Tweet

More Decks by Roma

Other Decks in Programming

Transcript

  1. Epic PHP #7
    Рома Лапин, Evercode Lab

    View Slide

  2. XML

    View Slide

  3. XML
    XML (англ. eXtensible Markup Language —
    расширяемый язык разметки; произносится [экс-эм-
    э́л]) — рекомендованный Консорциумом
    Всемирной паутины (W3C) язык разметки.

    View Slide

  4. XML

    View Slide

  5. XML
    • RSS

    • XML-RPC

    • Ajax

    View Slide

  6. XML

    View Slide

  7. XML
    • простой формальный синтаксис

    • в теории удобен для чтения и
    компьютеру и человеку

    • расширяемый

    • http://ru.wikipedia.org/wiki/XML

    View Slide

  8. XML


    Простой хлеб



    Мука

    Дрожжи

    Тёплая вода

    Соль





    Смешать все ингредиенты и тщательно замесить.

    Закрыть тканью и оставить на один час в тёплом помещении.



    Замесить ещё раз, положить на противень и поставить в духовку.





    View Slide

  9. XML
    • многословный

    • а значит тяжелый и объёмный

    • плохая поддержка типов данных

    View Slide

  10. Well Formed XML
    • Один корневой тэг

    • Все тэги открыты и закрыты правильно

    • Каждый узел тоже well formed

    View Slide

  11. Валидный XML
    • Well formed

    • Содержит указание на DTD

    • Следует этому DTD

    • DTD = Document Type Definition

    View Slide

  12. PHP + XML
    • SimpleXML

    • DOM

    • XMLReader, XMLWriter, XSLT processor

    View Slide

  13. DOM

    View Slide

  14. DOM
    DOM (от англ. Document Object Model —
    «объектная модель документа») — это не
    зависящий от платформы и языка программный
    интерфейс, позволяющий программам и скриптам
    получить доступ к содержимому HTML, XHTML и
    XML-документов, а также изменять содержимое,
    структуру и оформление таких документов.

    View Slide

  15. View Slide

  16. DOM в PHP
    • Расширение для работы с XML через
    DOM API

    • Загружает весь документ в память и
    создает внутреннее представление в виде
    дерева

    View Slide

  17. DOM
    $dom = new DomDocument('1.0');

    !
    $books = $dom->appendChild($dom->createElement('books'));

    !
    $book = $books->appendChild($dom->createElement('book'));

    !
    $title = $book->appendChild($dom->createElement('title'));

    !
    $title->appendChild($dom->createTextNode('Great American Novel'));

    !
    $dom->formatOutput = true;

    !
    $test1 = $dom->saveXML(); // put string in test1

    $dom->save('test1.xml'); // save as file

    View Slide

  18. DOM






    Great American Novel




    View Slide

  19. DomDocument
    • createElement()

    • createTextNode()

    View Slide

  20. DomNode
    • appendChild()

    • insertBefore()

    • cloneNode()

    • removeAttribute()

    • removeChild()

    View Slide

  21. SimpleXML

    View Slide

  22. SimpleXML
    • Легче в использовании, чем DOM

    • Что понятно из названия

    • Конструирует объект из xml

    View Slide

  23. SimpleXML

    View Slide

  24. SimpleXML
    $xml = new SimpleXMLElement($xmlstr);

    !
    echo $xml->instructions->step[0];

    !
    foreach ($xml->composition->ingridient as $ingridient) {

    echo $ingridient[‘unit’] . '
    ';

    }

    View Slide

  25. Добавляем узлы
    • SimpleXMLElement::addChild()

    • SimpleXMLElement::addAttribute()

    View Slide

  26. Добавляем узлы
    • asXML()

    • $library->book[0] = null; // удаление

    • children()

    • attributes()

    View Slide

  27. DOM + SimpleXML

    View Slide

  28. DOM + SimpleXML
    $sxe = simplexml_load_string($someXmlString);



    if ($sxe === false) {

    exit;

    }

    if (!$dom_sxe = dom_import_simplexml($sxe)) {

    exit;

    }



    $dom = new DOMDocument('1.0');

    $dom_sxe = $dom->importNode($dom_sxe, true);

    $dom_sxe = $dom->appendChild($dom_sxe);



    echo $dom->save('test2.xml');

    View Slide

  29. SimpleXML
    $dom = new domDocument;

    $dom->loadXML($xmlString);

    if (!$dom) {

    echo 'Error while parsing the document';

    exit;

    }



    $s = simplexml_import_dom($dom);



    echo $s->book[0]->title;

    View Slide

  30. Задание
    Напишем простой парсер новостей для RSS сервиса Яндекс.Новости.

    Выберите любой раздел, например, Туризм. Ссылка на RSS на него
    будет http://news.yandex.ru/travels.rss.

    !
    Скрипт должен брать RSS по URL и каждый записывать в базу
    с соответствующими полями: title, link, description, pubDate.

    При повторном запуске одни и те же новости в базу записываться не
    должны.

    !
    Что лучше использовать: file_get_contents(), SimpleXML, PDO.

    View Slide

  31. XPath
    $doc = new DOMDocument;

    !
    $doc->preserveWhiteSpace = false;

    !
    $doc->Load('book.xml');

    !
    $xpath = new DOMXPath($doc);

    !
    $query = '//book/chapter/tgroup/tbody/row/entry[. = "en"]';

    !
    $entries = $xpath->query($query);

    !
    foreach ($entries as $entry) {

    echo "Found {$entry->previousSibling->previousSibling->nodeValue}," .

    " by {$entry->previousSibling->nodeValue}\n";

    }

    View Slide

  32. XPath
    • Что-то среднее между регулярками и
    SQL

    • Стандарт, поддерживаемый множеством
    языков

    • $xpath = new DomXPath($dom)

    • Вызов DomXpath::query() возвращает
    объект DomNodeList

    View Slide

  33. SOAP

    View Slide

  34. Избегайте SOAP как
    только можно

    View Slide

  35. Но если все-таки
    интересно, то удачи
    вам!

    View Slide

  36. Еще про парсинг
    • symfony/dom-crawler

    • symfony/css-selector

    • fabpot/goutte

    • не изобретайте велосипед, короче

    View Slide

  37. JSON

    View Slide

  38. JSON
    (JavaScript Object
    Notation)

    View Slide

  39. View Slide

  40. JSON
    {

    "one": "A Number",

    "hello": "world",

    "myarray": ["orange", "apple", "banana"],

    "myobject": {"library": "books", "bar": "alcohol"}

    }

    View Slide

  41. JSON functions
    • json_decode

    • json_encode

    • json_last_error_msg

    • json_last_error

    View Slide

  42. JSON
    $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

    !
    $json = json_encode($arr);

    echo $json;

    !
    var_dump(json_decode($json));

    var_dump(json_decode($json, true));

    View Slide

  43. Bad JSON
    $bad_json = "{ 'bar': 'baz' }";

    json_decode($bad_json); // null

    !
    $bad_json = '{ bar: "baz" }';

    json_decode($bad_json); // null

    !
    $bad_json = '{ bar: "baz", }';

    json_decode($bad_json); // null

    View Slide

  44. Задание
    Сделаем небольшой и простой поисковик по сообщениям твиттера.

    Большинство методов Twitter API требуют регистрации приложения и
    специальных ключей. Но поиском можно пользоваться без этого.

    !
    index: форма с поисковым полем

    обработчик: запрос к Twitter API, парсинг json, вывод твитов в виде
    списка.

    !
    Формат запроса: https://search.twitter.com/search.json?q=epicskills

    Красиво оформить json для чтения полей: http://jsonlint.com/

    Дока для поиска: https://dev.twitter.com/docs/using-search

    View Slide

  45. CURL

    View Slide

  46. CURL
    cURL — свободная (распространяемая по лицензии
    MIT), кроссплатформенная служебная программа
    командной строки для копирования файлов по
    различным протоколам с синтаксисом URL.

    View Slide

  47. CURL

    View Slide

  48. CURL
    • читает сайты

    • отправляет формы

    • загружает файлы

    • и многое другое

    • БЕСПЛАТНО И БЕЗ СМС!!111

    View Slide

  49. CURL

    $ch = curl_init ("http://www.yandex.ru");

    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

    $yahoo = curl_exec ($ch);

    var_dump($yahoo);

    View Slide

  50. CURL
    • “Ну и че, это делается с помощью
    file_get_contents гораздо проще”,
    скажете вы.

    • И будете правы.

    • Но

    View Slide

  51. CURL
    • Что, если вам надо указать какой-нибудь
    заголовок? Например, HTTP_REFERER.

    • Или использовать Cookie и сохранить
    логин пользователя между страницами?

    • А форму отправить через POST?

    View Slide

  52. Закачиваем файл
    /* http://localhost/upload.php:

    print_r($_POST);

    print_r($_FILES);

    */

    !
    $ch = curl_init();

    !
    $data = array('name' => 'Foo', 'file' => '@/home/user/test.png');

    !
    curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');

    curl_setopt($ch, CURLOPT_POST, 1);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    !
    curl_exec($ch);

    View Slide

  53. Задание
    Переделайте скрипты предыдущих заданий на работу через CURL.

    View Slide

  54. API

    View Slide

  55. API
    • У кого-то уже есть данные, которые вам
    нужны

    • И по API их взять проще, чем парсить
    сайт

    • И автоматизировать можно

    • Да и оптимизировать

    View Slide

  56. REST

    View Slide

  57. REST
    • Representational State Transfer

    • Запросы выглядят, как отправленные
    формы

    • Ответ обычно XML или JSON

    • RESTafarians — это почти растаманы,
    только более упороты

    View Slide