Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

POST запрос TIdHTTP

92
31 июля 2007 года
Тень Пса
2.2K / / 19.10.2006
всем доброго времени суток!

есть проблема (искал на форуме не подошло пока ничего, не первый день всё-таки ;)), заключается в следующем:
- пользую TIdHTTP для отправки POST запроса скрипту на PHP;
- пользую реализацию метода POST в которойц указываеся URL, Stream In (Source), Stream Out;
- заполняю Stream In следующим методом:
Код:
AnsiString dd = "--";
    AnsiString crlf = "\r\n";
    AnsiString boundary;
    AnsiString buffer;

    TStringStream * str = new TStringStream(buffer);

  str->WriteString("Content-type: multipart/form-data; boundary="+boundary+crlf);

    boundary = "------" + randomString(20);

    str->WriteString(dd + boundary + crlf);
    str->WriteString("Content-Disposition: form-data; name=\"username\"" + crlf + crlf);
    str->WriteString(conf->readEntry("username") + crlf);

    str->WriteString(dd << boundary << crlf);
    str->WriteString("Content-Disposition: form-data; name=\"password\"" << crlf << crlf);
    str->WriteString(conf->readEntry("password") << crlf);

    str->WriteString(dd + boundary + crlf);
    str->WriteString("Content-Disposition: form-data; name=\"function\"" + crlf + crlf);
    str->WriteString("cpgAPI.catList" + crlf);

    str->WriteString(dd + boundary + crlf);
    str->WriteString("Content-Disposition: form-data; name=\"cat\"" + crlf + crlf);
    str->WriteString("0" + crlf);

    str->WriteString(crlf + dd + boundary + dd + crlf + "\0");


- потом посылаю это все дело POST запросом: IdHttp1->Post(url, str, response); (где response тоже StringStream, в который возвращается результат)....

в общем проблема - сниффером вижу, что уходит только строчка
[quote=Sniffer]
POST /api/index.php HTTP/1.1
[/quote]

больше ничего.... ну и соотвессна скрипт знает что его вызвали ПОСТом, но не видит параметров запроса, т.к. тело не передаётся......

вопрос: как победить? :)
246
31 июля 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: Тень Пса
всем доброго времени суток!

есть проблема (искал на форуме не подошло пока ничего, не первый день всё-таки ;)), заключается в следующем:
- пользую TIdHTTP для отправки POST запроса скрипту на PHP;
...
больше ничего.... ну и соотвессна скрипт знает что его вызвали ПОСТом, но не видит параметров запроса, т.к. тело не передаётся......

вопрос: как победить? :)


Посмотри чего IE (например) отправляет при таком запросе и сделай так же...
А вообще и используй WinInet.

92
31 июля 2007 года
Тень Пса
2.2K / / 19.10.2006
дело в том, что это сдернуто с рабочей программы, тока она на Qt :)

а сделать так же, мне не позволяет сам компонент. я ж говорю, он принимает Source, я уже всё, что только мог туда пихал :) и полные хидеры, и всё на свете. но блин, не кушает он у меня body запроса и всё...

есть еще TNMHTTP или как-то так, с вкладки FastNet, дык вот он хоть хидер нормальный отправляет. а тело запроса, нихатит :( мож кто-нибудь воевал уже с таким делом и победил? хотелось бы компонентами обойтись... в принципе, но если никто не побеждал такую гадость, то попробую заюзать WinInet, авось получится :)))
246
31 июля 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: Тень Пса
дело в том, что это сдернуто с рабочей программы, тока она на Qt :)

а сделать так же, мне не позволяет сам компонент. я ж говорю, он принимает Source, я уже всё, что только мог туда пихал :) и полные хидеры, и всё на свете. но блин, не кушает он у меня body запроса и всё...

есть еще TNMHTTP или как-то так, с вкладки FastNet, дык вот он хоть хидер нормальный отправляет. а тело запроса, нихатит :( мож кто-нибудь воевал уже с таким делом и победил? хотелось бы компонентами обойтись... в принципе, но если никто не побеждал такую гадость, то попробую заюзать WinInet, авось получится :)))


сюда посмотри: http://forum.codenet.ru/showthread.php?t=17655&highlight=%E7%E0%EA%E0%F7%EA%E0
по моему из той же оперы...

92
01 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
немного не получилось :((

даже WinInet отправляет всё в хидере, а sweb говорит, что мой запрос отклонён в виду его возможной небезопасности :'((((

посылаю Content-Type: multipart/form-data.... c application/x-www-form-urlencoded всё окей...


естессна устанаваливаю boundary в шеснадцатиричное число.

пробовал и каждую часть брать в boundary и всё вместе, ничего не помогает
и так пробовал:
Код:
--2f876dc
Content-Disposition: form-data; name="username";
watchdog

--2f876dc--

--2f876dc
Content-Disposition: form-data; name="password";
********

--2f876dc--


и так

 
Код:
--2f876dc
Content-Disposition: form-data; name="username";
watchdog

Content-Disposition: form-data; name="password";
********

--2f876dc--


запрос уходит, а толку нет.

может я что-то не понимаю в отправке multipart/form-data?

подскажите пжалста :) кто уже этим "баловался"...
92
01 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
разобрался ) посылается, но файл не доходит :D

[COLOR=DimGray]помог материал по ссылке http://www.15seconds.com/issue/001003.htm[/COLOR]

Код:
POST /api/index.php HTTP/1.1
Content-Length: 640
Accept-Encoding: gzip,deflate
Accept: text/html,text/plain,text/xml,image/jpeg,image/gif,image/*;q=0.5
Content-Type: multipart/form-data; boundary=---------------------------7d51d919f0276
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5
Host: www.host.com
Proxy-Connection: Keep-Alive
Pragma: no-cache


-----------------------------7d51d919f0276
Content-Disposition: form-data; name="username";

watchdog
-----------------------------7d51d919f0276
Content-Disposition: form-data; name="password";

********
-----------------------------7d51d919f0276
Content-Disposition: form-data; name="function";

upload
-----------------------------7d51d919f0276
Content-Disposition: form-data; name="aid";

3
-----------------------------7d51d919f0276
Content-Disposition: form-data; name="file"; filename="c:\aeros.jpg"
Content-Type: image/jpeg
Transfer-Encoding: binary


-----------------------------7d51d919f0276--
а вот как после Transfer-Encoding: binary запихать двоичные данные, в AnsiString :rolleyes:

чего-то не получается :( не могу допетрить...
92
01 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
Делаю теперь Content-Transfer-Encoding: base64 чтобы передать бинарник. ну соотвессна контент кодирую в base64.

всё передаётся, но php-скрипт ругается, что картинка неправильная вся :( потому что приходят base64-кодированные данные... ну и соотвессна в файле оказываются они же.

как сказать апачу, чтобы он декодировал это всё дело?

PS: менять php-скрипт нельзя, это готовое API продукта, под который пишется приложение :rolleyes:
92
07 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
всем спасибо, всё решилось.

посылаю массив byte :)

главное: правильно указать Content-Length. :)

PS: прошу тему закрыть :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог