Я делаю с помощью курла запрос. Нужно, чтобы запрос отдавал методом POST xml-код. В коде ниже он содержится в переменной $query_xml Код (Text): $query_xml='<?xml version="1.0" encoding="UTF-8"?> <request> <query>paratruper </query> <groupings> <groupby attr="d" mode="deep" groups-on-page="10" docs-in-group="1" /> </groupings> </request>'; curl_setopt($ch, CURLOPT_POST, 1); 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): POST /xmlsearch?user=my1&key=32423423 HTTP/1.1 Host: xmlsearch.yandex.ru Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3 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 Content-Length: 217 Content-Type: application/x-www-form-urlencoded <?xml version="1.0" encoding="UTF-8"?> <request> <query>paratruper</query> <groupings> <groupby attr="d" mode="deep" groups-on-page="10" docs-in-group="1" /> </groupings> </request> Какие опции задать в curl, чтобы запрос был корректным multipart/form-data?
Внимательнее читайте документацию, в том числе комментарии и пример использования CURLOPT_POSTFIELDS. Потому что Дарт Вейдер снисходительнее Императора.
Samsonov, спасибо за ответ. Судя по цитате из документации я должен передать параметры в виде массива. А как это сделать в моём случае, когда я даже не знаю, в какой ключ поместить мой xml-код? PHP: $query_xml='<?xml version="1.0" encoding="UTF-8"?> <request> <query>paratruper </query> <groupings> <groupby attr="d" mode="deep" groups-on-page="10" docs-in-group="1" /> </groupings> </request>'; curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('somekey'=>$query_xml)); Какое слово должно быть на месте слова somekey? Интересно, что обычная форма, заполненная в браузере, посылает параметры и когда multipart/form-data и когда application/x-www-form-urlencoded в форме ключ=>значение. Как видно из моего примера это вовсе не обязательно. Мой xml-документ просто посылается в теле запроса и непонятно, какому ключу он должен назначаться. На сервере мой xml-документ будет доступен в переменной $_REQUEST['XML'] или в $_REQUEST['FOO']? Вот в чём вопрос, однако.
Неужели никто не разбирается в POST запросах? Вопрос может не с практической точки зрения интересен, а с теоретической, интересен для самообразования так сказать.
Метод application/x-www-form-urlencoded, который я использую, должен посылать те же самые параметры, как в URL, только методом POST. Поэтому отправка данных 'var'=1 и 'var2'=10 в POST-запросе должна выглядеть примерно так (вместе с заголовками) Код (Text): POST /xmlsearch?user=my1&key=32423423 HTTP/1.1 Host: xmlsearch.yandex.ru Content-Type: application/x-www-form-urlencoded var=1&var=2 В моём первом посте это правило нарушено. Но проведя тест на локальном хосте, я увидел, что массив $_REQUEST заполнился такими данными: Код (Text): ["<?xml_version"]=> string(416) ""1.0" encoding="utf-8"?> <request><query> .... </request>" Как видно, сервер пытается разбить полученную строку по правила URL и считает всё до первого символа "=" наименованием ключа, а всё после - значением. Только вот непонятно, почему на сервере Яндекса не возникает никакой ошибки. Наверное они учитывают такую ошибку и делают какие-то преобразования с полученными данными, чтобы воссоздать нормальный xml-документ.