За последние 24 часа нас посетил 15181 программист и 1388 роботов. Сейчас ищут 834 программиста ...

Curl, Multipart/form-data и стандарт

Тема в разделе "Прочие вопросы по PHP", создана пользователем kombain, 16 апр 2011.

  1. kombain

    kombain Активный пользователь

    С нами с:
    28 авг 2010
    Сообщения:
    50
    Симпатии:
    0
    Я делаю с помощью курла запрос. Нужно, чтобы запрос отдавал методом POST xml-код. В коде ниже он содержится в переменной $query_xml
    Код (Text):
    1.  
    2. $query_xml='<?xml version="1.0" encoding="UTF-8"?>  
    3.     <request>  
    4.         <query>paratruper </query>
    5.         <groupings>
    6.             <groupby attr="d" mode="deep" groups-on-page="10"  docs-in-group="1" />    
    7.         </groupings>    
    8.     </request>';
    9.  
    10. curl_setopt($ch, CURLOPT_POST, 1);
    11. curl_setopt($ch, CURLOPT_POSTFIELDS, $query_xml);
    Всё работает вроде нормально... Смущает вот что:
    1) запрос посылается с заголовком Content-Type: application/x-www-form-urlencoded в котором могут посылаться только ASCII символы. А у меня в xml-коде могут быть и русские символы. То есть мне нужен формат multipart/form-data.
    2) Не знаю, как послать xml-текст в виде multipart/form-data. Как я понимаю, для этого нужно посылать на сервер данные в виде ключа=>ответа. А у меня запрос выполняется без всяких ключей, причём очень успешно и я не понимаю почему. То есть мне нужно послать на сервер xml-текст, но уже в формате multipart/form-data. Так будет по стандартам и я буду уверен, что в будущем не возникнет проблем.

    Вот мой успешный POST-запрос на сервер в виде application/x-www-form-urlencoded, который я хочу посылать в виде multipart/form-data:
    Код (Text):
    1.  
    2. POST /xmlsearch?user=my1&key=32423423 HTTP/1.1
    3. Host: xmlsearch.yandex.ru
    4. Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    5. Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
    6. Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
    7. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10
    8. Content-Length: 217
    9. Content-Type: application/x-www-form-urlencoded
    10.  
    11. <?xml version="1.0" encoding="UTF-8"?>  
    12.     <request>  
    13.         <query>paratruper</query>
    14.         <groupings>
    15.             <groupby attr="d" mode="deep" groups-on-page="10"  docs-in-group="1" />    
    16.         </groupings>    
    17.     </request>
    Какие опции задать в curl, чтобы запрос был корректным multipart/form-data?
     
  2. Samsonov

    Samsonov Активный пользователь

    С нами с:
    31 мар 2011
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    DC
    Внимательнее читайте документацию, в том числе комментарии и пример использования CURLOPT_POSTFIELDS.

    Потому что Дарт Вейдер снисходительнее Императора. :)
     
  3. kombain

    kombain Активный пользователь

    С нами с:
    28 авг 2010
    Сообщения:
    50
    Симпатии:
    0
    Samsonov, спасибо за ответ. Судя по цитате из документации

    я должен передать параметры в виде массива. А как это сделать в моём случае, когда я даже не знаю, в какой ключ поместить мой xml-код?
    PHP:
    1. $query_xml='<?xml version="1.0" encoding="UTF-8"?>    
    2.    <request>    
    3.       <query>paratruper </query>
    4.       <groupings>
    5.          <groupby attr="d" mode="deep" groups-on-page="10"  docs-in-group="1" />    
    6.       </groupings>    
    7.    </request>';
    8.  
    9. curl_setopt($ch, CURLOPT_POST, 1);
    10. curl_setopt($ch, CURLOPT_POSTFIELDS, array('somekey'=>$query_xml));
    11.  
    Какое слово должно быть на месте слова somekey?
    Интересно, что обычная форма, заполненная в браузере, посылает параметры и когда multipart/form-data и когда application/x-www-form-urlencoded в форме ключ=>значение. Как видно из моего примера это вовсе не обязательно. Мой xml-документ просто посылается в теле запроса и непонятно, какому ключу он должен назначаться. На сервере мой xml-документ будет доступен в переменной $_REQUEST['XML'] или в $_REQUEST['FOO']? Вот в чём вопрос, однако.
     
  4. kombain

    kombain Активный пользователь

    С нами с:
    28 авг 2010
    Сообщения:
    50
    Симпатии:
    0
    Неужели никто не разбирается в POST запросах? Вопрос может не с практической точки зрения интересен, а с теоретической, интересен для самообразования так сказать.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    kombain
    firebug разбирается =)

    ну и какую-нить спецификацию можно полистать.
     
  6. kombain

    kombain Активный пользователь

    С нами с:
    28 авг 2010
    Сообщения:
    50
    Симпатии:
    0
    Метод application/x-www-form-urlencoded, который я использую, должен посылать те же самые параметры, как в URL, только методом POST. Поэтому отправка данных 'var'=1 и 'var2'=10 в POST-запросе должна выглядеть примерно так (вместе с заголовками)
    Код (Text):
    1.  
    2. POST /xmlsearch?user=my1&key=32423423 HTTP/1.1
    3. Host: xmlsearch.yandex.ru
    4. Content-Type: application/x-www-form-urlencoded
    5.  
    6. var=1&var=2
    В моём первом посте это правило нарушено. Но проведя тест на локальном хосте, я увидел, что массив $_REQUEST заполнился такими данными:
    Код (Text):
    1.  
    2. ["<?xml_version"]=>
    3.   string(416) ""1.0" encoding="utf-8"?>
    4. <request><query> .... </request>"
    Как видно, сервер пытается разбить полученную строку по правила URL и считает всё до первого символа "=" наименованием ключа, а всё после - значением. Только вот непонятно, почему на сервере Яндекса не возникает никакой ошибки. Наверное они учитывают такую ошибку и делают какие-то преобразования с полученными данными, чтобы воссоздать нормальный xml-документ.