Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |  |  |  |  |  |
Большое спасибо. Тема закрыта 21.09.07 15:52 Число просмотров: 1604
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
[moved from networking]
|
<programming>
|
Не могу получить данные через POST 20.09.07 08:25 [ZloyShaman, dl]
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Делаю следующую вещь. Программа под Windows на C++ устанавливает соединение с сервером, обращается к URL передавая ему данные через заголовок:
…
wsprintf(szURL, "http://www.indigo.ringingcedarsofrussia.org/veche/login.php");
wsprintf(szHeader, "l:%s\np:%s", szLogin, szPassw);
…
hURL = InternetOpenUrl(hInternetSession, lpcszURL, lpcszHeader, lstrlen(lpcszHeader), 0, 0);
…
---
Данные в заголовке успешно доходят до сервера. Там я их обрабатываю PHP-скриптом (параметры присутствуют в массиве, возвращаемом функцией GetAllHeaders):
$headers = GetAllHeaders();
echo “$headers['l']<br>$headers['p']”;
---
Но вот через переменную $_POST к этим данным я обратиться не могу. В чём причина?
|
 |
во-первых, InternetOpenUrl работает через GET 20.09.07 13:33
Автор: dl <Dmitry Leonov>
|
[moved from networking] Для POST нужно использовать InternetConnect, HttpOpenRequest, HttpSendRequest.
Во-вторых, даже если бы тут работал POST, то с чего вдруг переменным из заголовка на стороне сервера попадать в $_POST, куда должны складываться переменные, извлеченные из тела запроса.
|
 |  |
Насколько мне известно, данные, передаваемые методом POST... 21.09.07 04:49
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 21.09.07 04:53 Количество правок: 2
|
[moved from networking] Насколько мне известно, данные, передаваемые методом POST для сервера «пустой звук» (он их никак не интерпретирует – так говорит Д. Котеров «Самоучитель PHP» стр.35), поэтому PHP, получив заголовок, должен его разобрать и сформировать переменную $_POST. Чтобы это сделать, интерпретатор читает длину заголовка из переменной “Content-Length”.
Переписал код с Вашими рекомендациями:
DWORD dwBytesRead;
char sz[255];
HINTERNET hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hInternet, "www.indigo.ringingcedarsofrussia.org",
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1u);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "veche//login.php", NULL, NULL,
0, INTERNET_FLAG_KEEP_CONNECTION, 1);
BOOL bSend = HttpSendRequest(hRequest, "l:VedaCoder@mail.ru\np:123456",-1, NULL,0);
InternetReadFile(hRequest, sz, 255, &dwBytesRead);
---
Вот, что получает сервер (читаю headers функцией InternetReadFile):
[Cache-Control] => no-cache
[Connection] => Keep-Alive
[Content-Length] => 0
[Host] => www.indigo.ringingcedarsofrussia.org
[l] => VedaCoder@mail.ru
[p] => 123456
[User-Agent] => Test
---
Наверное, проблема в том, что Content-Length = 0. Где у меня опять прокол?
|
 |  |  |
заголовки не относятся к телу запроса 21.09.07 05:03
Автор: dl <Dmitry Leonov>
|
[moved from networking] Заголовки, разделенные переводом строки, сами по себе, запрос сам по себе. Идет он сразу после заголовков, отделенным еще одним переводом строки. В Content-Length лежит длина запроса (и его надо формировать самостоятельно). Отдельные параметры запроса разделяются не переводом строки, а &, каждый параметр - как имя=значение.
т.е. передавать надо что-то типа
"Content-Length=30\n\nl=VedaCoder@mail.ru&p=123456"
Нелатиницу при этом лучше превращать в вид %XX.
|
 |  |  |  |
В MSDN сказано, что HttpSendRequest вторым параметром... 21.09.07 05:42
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 21.09.07 06:30 Количество правок: 3
|
[moved from networking] В MSDN сказано, что HttpSendRequest вторым параметром принимает header, а третьим его размер. Если этот размер выставить в -1, то он будет рассчитан автоматически.
Когда я добавляют строку “Content-Length” в начало своего заголовка (“Content-Length:29\n\nl:VedaCoder@mail.ru&p:123456”) функция HttpSendRequest виснет (выхода из неё в отладчике я так и не дождался).
Пардон, в HttpSendRequest я не туда свои данные передал. Их нужно в 4 и 5 параметр. Но это не помогло. Content-Length теперь не нулевая, но в _POST данных по прежнему нету:
BOOL bSend = HttpSendRequest(hRequest, NULL, 0, "l=VedaCoder@mail.ru&p=123456",29);
ЗЫ. Спасибо за быстрый ответ.
|
 |  |  |  |  |
реально, конечно, нужно не 29, а sizeof(строки) 21.09.07 13:33
Автор: dl <Dmitry Leonov>
|
[moved from networking] Для контроля на стороне сервера стоит распечатать, что ему при этом приходит на stdin.
Ну и полезно указать среди заголовков Content-type: application/x-www-form-urlencoded
|
 |  |  |  |  |  |
dl, спасибо. Проблема была в том, что не указывал... 21.09.07 13:46
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
[moved from networking] dl, спасибо. Проблема была в том, что не указывал "Content-Type:application/x-www-form-urlencoded". Вот рабочий код:
DWORD dwBytesRead;
char sz[255];
HINTERNET hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hInternet, "indigo.ringingcedarsofrussia.org",
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1u);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "veche/login.php", HTTP_VERSION, "localhost",
0, INTERNET_FLAG_KEEP_CONNECTION, 1);
BOOL bSend = HttpSendRequest(hRequest, "Content-Type:application/x-www-form-urlencoded", -1, "l=VedaCoder@mail.ru&p=123456",28);
InternetReadFile(hRequest, sz, 255, &dwBytesRead);
---
Может быть есть ещё какие-нибудь параметры в заголовке, которые также желательно указать, чтобы не возникало проблем?
|
 |  |  |  |  |  |  |
этих достаточно 21.09.07 13:52
Автор: dl <Dmitry Leonov>
|
[moved from networking] Размер и тип передаваемых данных, остальное опционально - referer, user-agent, authorization, куки и т.п.
Разве что в зависимости от хостинга может потребоваться указание заголовка Host, чтобы взаимодействовать с одним из виртуальных серверов, лежащих на одном IP (хотя есть шанс ,что WinINet и его может формировать самостоятельно).
|
 |  |  |  |  |  |  |  |
Большое спасибо. Тема закрыта 21.09.07 15:52
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
[moved from networking]
|
|
|