POST запрос при помощи WinInet
От: vcdima  
Дата: 31.10.06 11:20
Оценка:
Доброго всем времени суток!

Стоит задача отправить POST запрос по SSL при помощи WinInet. Т.е. нужно cэмитировать форму.

<form name=form1 method=post action='https://….’ >

Если использовать обычную форму, приходит нормальный ответ от сервера. При помощи WinInet, в ответе — контент сайта. Похоже, сервер не понимает, что это POST запрос, а обрабатывает его просто как запрос на открытие страницы. В чем может быть дело?


AcceptTypes : array [0..1] of pchar = ('*/*',nil);
Headers := 'Content-Type: application/x-www-form-urlencoded';

FSession:=InternetOpen(pchar(Agent),INTERNET_OPEN_TYPE_PRECONFIG ,nil,nil,0);

FConnect:=InternetConnect(FSession,pchar(Server), INTERNET_DEFAULT_HTTPS_PORT ,nil,nil,INTERNET_SERVICE_HTTP,0,0);

hRequest:=HttpOpenRequest(FConnect,'POST', Pchar(Url), 'HTTP/1.0' ,nil,@AcceptTypes,
INTERNET_FLAG_RELOAD or INTERNET_FLAG_SECURE or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID,0);

Buffer:=HttpEncode(Request);

HttpSendRequest(hRequest,Headers, length(Headers),pchar(Buffer),StrLen(pchar(Buffer)));

HttpQueryInfo(hRequest,HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,@Status,Size,Res);

InternetQueryDataAvailable(hRequest,Size,0,0)

SetLength(Buffer,Size);
InternetReadFile(hRequest,pchar(Buffer),Size,Size)
Re: POST запрос при помощи WinInet
От: shurik.  
Дата: 31.10.06 11:58
Оценка: 3 (1)
я делал так

LPCTSTR accept[] = {_T("*/*"), 0};
m_hRequest = HttpOpenRequest(*i_pConnect,
    _T("POST"), 
    i_Target,
    NULL,
    NULL,
    accept,
    INTERNET_FLAG_NO_UI | (i_pConnect->IsSSL() ? INTERNET_FLAG_SECURE : 0),
    0);

// потом надо добавить 2 хидера (см. HttpAddRequestHeaders)
// AppendHeader(_T("Content-Type"), _T("application/x-www-form-urlencoded"));
// AppendHeader(_T("Content-Length"), dataSizeStr);


// параметры - похоже как для php, только в начале нет ?
data = urlencode(_T("param1=val1&param2=val2"));

HttpSendRequest(m_hRequest, NULL, 0, (void*)(LPCSTR)data, dataSize)) {


надеюсь, суть понятна 8)
Re[2]: POST запрос при помощи WinInet
От: vcdima  
Дата: 01.11.06 08:55
Оценка:
Здравствуйте, shurik., Вы писали:

S>я делал так


S>
S>LPCTSTR accept[] = {_T("*/*"), 0};
S>m_hRequest = HttpOpenRequest(*i_pConnect,
S>    _T("POST"), 
S>    i_Target,
S>    NULL,
S>    NULL,
S>    accept,
S>    INTERNET_FLAG_NO_UI | (i_pConnect->IsSSL() ? INTERNET_FLAG_SECURE : 0),
S>    0);

S>// потом надо добавить 2 хидера (см. HttpAddRequestHeaders)
S>// AppendHeader(_T("Content-Type"), _T("application/x-www-form-urlencoded"));
S>// AppendHeader(_T("Content-Length"), dataSizeStr);


S>// параметры - похоже как для php, только в начале нет ?
S>data = urlencode(_T("param1=val1&param2=val2"));

S>HttpSendRequest(m_hRequest, NULL, 0, (void*)(LPCSTR)data, dataSize)) {

S>


S>надеюсь, суть понятна 8)



Спасибо. Только код практически аналогичен. Проблема, что POST запрос отправляется, но некорретно обрабатывается. На одном адресе (допустим https://www.mail.ru) одновремено висит и сайт, и POST-обработчик. И мне вместо ответа приходит контент сайта. Если отправлять запрос через форму, все отрабатывает нормально. Не пойму в чем загвоздка. Не удается сэмитировать форму по микрософту =(
Re[3]: POST запрос при помощи WinInet
От: shurik.  
Дата: 01.11.06 15:35
Оценка:
Здравствуйте, vcdima, Вы писали:

V>Здравствуйте, shurik., Вы писали:


V>Спасибо. Только код практически аналогичен. Проблема, что POST запрос отправляется, но некорретно обрабатывается. На одном адресе (допустим https://www.mail.ru) одновремено висит и сайт, и POST-обработчик. И мне вместо ответа приходит контент сайта. Если отправлять запрос через форму, все отрабатывает нормально. Не пойму в чем загвоздка. Не удается сэмитировать форму по микрософту =(


действительно, практически одно и тоже...
дочитал сообщение только до слов POST и форма, а т.к. только недавно сам этим занимался то и написал что делал.

в общем дело было так:
мне сказали — надо как делает форма!
и я ответил — не вопрос!

взял снифер, посмотрел что отправляет форма (на http не на https, есно)
написал то же самое в коде и заработало

снифер — http://www.ethereal.com/download.html
только к нему ещё нужно WinPCap, в гугле моментом можно найти 8)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.