Получить тело http-запроса

Программирование на Active Server Pages и VBScript.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Получить тело http-запроса

Сообщение Scuder » 08.11.2005 (Вт) 18:26

Может, не в тему форума.. Но больше некуда. :-)
Изнасиловал rambler в извращённой форме, ничего не нашёл. :-(

Ситуация такая: передаю с помощью MSXML методом POST некие данные (XML) на ASP-страницу.

Вопрос: как этой странице "увидеть" текст XML?

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 08.11.2005 (Вт) 22:29

ASP-страница, надо понимать, твоя? Если так, то
Код: Выделить всё
Dim xml

xml = Request.Form("xml_value")
xml = Replace(xml, "&", "&")
xml = Replace(xml, "<", "&lt;")
xml = Replace(xml, ">", "&gt;")
Response.Write "<pre>" & xml & "</pre>"
или
Код: Выделить всё
Dim xml

xml = Request.Form("xml_value")
xml = Replace(xml, "&", "&amp;")
xml = Replace(xml, "<", "&lt;")
xml = Replace(xml, ">", "&gt;")
xml = Replace(xml, "  ", "&nbsp; ")
xml = Replace(xml, "  ", " &nbsp;")
xml = Replace(xml, vbCrLf & " ", vbCrLf & "&nbsp;")
Response.Write xml


В первом случае длинные строки не будут переноситься в конце экрана, во втором - шрифт не будет автоматически моноширинным.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.11.2005 (Ср) 12:23

ASP-страница, конечно же, моя.
Но ничего не получается.. :-(

Вот код запроса:

Код: Выделить всё
Dim Con As MSXML2.XMLHTTP
Set Con = New MSXML2.XMLHTTP

pURL = "http://.../Test.asp"
Con.open "POST", pURL, True

Con.setRequestHeader "Accept-Language", "ru, en"
Con.setRequestHeader "Accept-Charset", "Windows-1251;q=1"
Con.setRequestHeader "Content-Type", "text/xml; charset=Windows-1251"
Con.setRequestHeader "Content-Length", CStr(Len(rQuery))
Con.send rQuery

Do While Con.readyState <> 4
[...]
Loop

MsgBox Con.responseText


Код страницы:

Код: Выделить всё
Response.Write Request.Form("xml_value")


Len(Con.responseText) = 0 :-(

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 09.11.2005 (Ср) 15:09

Код: Выделить всё
Con.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
Con.send "xml_value=" & rQuery

Отправка данных POST ом при помощи XMLHttpRequest

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.11.2005 (Ср) 15:22

skiperski, такой вариант работает. Но вопрос остаётся, поскольку я таким образом отсылаю информацию в несколько абсолютно разных систем, и все они видят и обрабатывают запрос. На PHP действительно всё видно из переменной $HTTP_RAW_POST_DATA. Но нужно увидеть xml в ASP и PERL. То есть формат запроса должен быть одинаковым для любых систем, независимо от web-сервера и языка программирования..

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 09.11.2005 (Ср) 15:31

Я тестировал на ASP. Всё работает. Все переменные видны как стандартные переменные запроса. На Perl тоже по идее должно.
Код: Выделить всё
Response.Write Request.Form("xml_value")

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.11.2005 (Ср) 15:38

Да нет, я не спорю, что работает. За это спасибо. :-)
Но должно работать так, как это было представлено в первоначальном варианте:

Код: Выделить всё
Con.setRequestHeader "Content-Type", "text/xml; charset=Windows-1251"
Сon.send rQuery


Вот в этом случае можно как-то xml увидеть?

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 09.11.2005 (Ср) 16:17

Бр... Я, видимо, чего-то не понимаю. Если с заголовком "Content-Type", "application/x-www-form-urlencoded" работает в ASP и, как вы говорите, в PHP, и, наверняка, в Perl, то что же ещё требуется? Имя переменной в строке запроса можно, по крайней мере для ASP, опустить.

Т.е. в вашем коде меняется только заголовок Content-Type. В итоге на сервере вы получаете XML в переменной или как Form(). Дальше засовывать его в DOMDocument и работать с ним дальше. В чём проблема-то? XML ведь передаётся. Сервер-то принимает только запросы GET, POST или бинарные. Это для клиента важно какой тип данных к нему пришёл. Т.е., если вы отправляете XML с сервера, то тогда нужно выставить заголовок
Код: Выделить всё
Response.AddHeader "Content-Type", "text/xml; charset=Windows-1251"

Тогда в Con.responseXML получите XML-ответ с сервера.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.11.2005 (Ср) 16:38

Нет, я сейчас всё поподробнее объясню. :-)

Есть такой вот код:
Код: Выделить всё
Con.setRequestHeader "Content-Type", "text/xml; charset=Windows-1251"
Сon.send rQuery


Я его использую для передачи информации в разные платёжные системы. Они всё прекрасно видят, обрабатывают и возвращают мне ответ в виде xml, которую я вижу в Con.responseText. Тут самое главное - то, что этот вариант работает. Но когда я передаю то же самое своей ASP-страничке, я не знаю как увидеть там xml.

Понятно (наверное), что нужно использовать Request. Но Request чего? Какой параметр запрашивать, если POST пришёл не от формы?

Дальше.
Код: Выделить всё
Con.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
Con.send "xml_value=" & rQuery

Это работает. Если опустить хотя бы одну из этих строчек, оставив старую, работать уже не будет. Но суть не в этом. В данном случае изменяется заголовок и добавляется переменная.

Так вот, вопрос: как увидеть XML на сервере, не внося изменений в первоначальный код?

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 09.11.2005 (Ср) 17:15

Scuder писал(а):Но когда я передаю то же самое своей ASP-страничке, я не знаю как увидеть там xml.

Я тоже. Только что пробовал, ничего нет :(. Откуда берут инфу другие службы понятия не имею. Ни в одном из свойств Request'а ничего похожего на входящие данные нет.

Scuder писал(а):В данном случае изменяется заголовок и добавляется переменная.

Меняй только заголовок, а строчку Con.send rQuery оставь как есть. Попробуй в таком виде запросить данные в тех платёжных системах, если сработает, то проблема решена, т.к. в своей странице ты сможешь данные запроса вытянуть как Request.Form без параметров.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.11.2005 (Ср) 17:26

skiperski писал(а):Я тоже. Только что пробовал, ничего нет :(. Откуда берут инфу другие службы понятия не имею. Ни в одном из свойств Request'а ничего похожего на входящие данные нет.


Вот! Я тоже уже всё пересмотрел, ничего не нашёл. Мне одно непонятно - я не знаю PHP, но откуда там берётся переменная $HTTP_RAW_POST_DATA? Волшебство какое-то.. :-(

skiperski писал(а):Меняй только заголовок, а строчку Con.send rQuery оставь как есть. Попробуй в таком виде запросить данные в тех платёжных системах, если сработает, то проблема решена, т.к. в своей странице ты сможешь данные запроса вытянуть как Request.Form без параметров.


Хм.. У меня тут самые настоящие платежи.. И их очень много. :-)
Попробую как-нибудь, когда нагрузка не очень большая будет..

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 10.11.2005 (Чт) 14:37

Знайшов!!!
Код: Выделить всё
Response.BinaryWrite Request.BinaryRead(Request.TotalBytes)

Request.BinaryRead возвращает байтовый массив, поэтому выводится методом Response.BinaryWrite. Перевод массива в строку придумывай сам (StrConv почему-то не работает [Type mismatch: 'StrConv']). Придумаешь - поделись.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 10.11.2005 (Чт) 16:45

Прикольно. :-)

Не знаю, вот нашёл на JavaScript, но что-то не хочет работать..
http://forum.rsdn.ru/article/inet/upload.xml#EFFA

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 17.11.2005 (Чт) 18:59

Всё гениальное просто.. ;-)

Код: Выделить всё
a = Request.BinaryRead(Request.TotalBytes)

For nIndex = 1 to LenB(a)
   PostData = PostData & Chr(AscB(MidB(a,nIndex,1)))
Next

Response.Write PostData


Вернуться в ASP и VBScript

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList