Консультация № 39710
08.04.2006, 10:14
0.00 руб.
0 1 1
Здравствуйте уважаемые эксперты! Попытался недавно сделать программку, которая бы отсылала информацию на сервер методом POST. Не получилось. Нашёл пример (он в приложении), но при отладке он выдаёт "Invalid variant type". (ошибка происходит в самом конце
We.Navigate2(vWebAddr, vFlags, vFrame, vPostData, vHeaders); )

Вопрос: Что тут неправильно (я так и не смог понять, в чём же проблема)?
Заранее спасибо.

Приложение:
function HTTPTran(St : String) : String;var i : Integer; begin Result:=‘‘; for i:=1 to length(St) do if St[i] in [‘a‘..‘z‘,‘A‘..‘Z‘,‘0‘,‘1‘..‘9‘] then Result:=Result+St[i] else if St[i]=‘ ‘ then Result:=Result+‘+‘ else Result:=Result+‘%‘+IntToHex(Byte(St[i]),2); end;procedure TForm1.Button1Click(Sender: TObject);var vWebAddr, vPostData, vFlags, vFrame, vHeaders: OleVariant; iLoop: Integer; stPostData:string;begin stPostData:=‘srok=‘+ HTTPTran(‘0‘) +‘&‘+ ‘country=‘+ HTTPTran(‘UA‘) +‘&‘+ ‘countryFromRegionID=‘+ HTTPTran(‘8‘) +‘&‘+ ‘load=‘+ HTTPTran(‘‘); if Length(stPostData)> 0 then begin {Require this header information if there is stPostData.} vHeaders:= ‘Content-Type: application/x-www-form-urlencoded‘+ #10#13#0; {Set the variant type for the vPostData.} vPostData:= VarArrayCreate([0, Length(stPostData)], varByte); for iLoop := 0 to Length(stPostData)- 1 do // Iteratebegin vPostData[iLoop]:= Ord(stPostData[iLoop+ 1]); end; // for {Final terminating Character.} vPostData[Length(stPostData)]:= 0; {Set the type of Variant, cast} TVarData(vPostData).vType:= varArray; end; {And the other stuff.} vWebAddr:= ‘http://avtotrans.net/?op=gruzadd&r=a‘; {Make the call Rex.} We.Navigate2(vWebAddr, vFlags, vFrame, vPostData, vHeaders); end; {End of Navigate procedure.} end.

Обсуждение

Неизвестный
08.04.2006, 11:22
общий
это ответ
Здравствуйте, Chapay!
Можно решить проблему другим способом - использовать другой "метод" для реализации POSTa: формируем url:
http://some_site.ru/script.cgi?parametr1=qwerty¶metr2=123456¶metr3=asdfg
Аналогичным образом можно сформировать Ваш запрос. А реализовать его в Вашей проге, можно иcпользуя компонент TWebBrowser (вкладка Internet) и передавать этот урл через WebBrowser.Navigate (‘урл‘);
Но тут есть один "подводный камень" если передавать в качестве параметра русские буквы, то сервер их будет "кушать" закорючками, а избавиться от этого можно следующи кодом (см. прил.)

Приложение:
function NormalizeRusText(Text: string): string;var c: char; i: integer; chars: array [char] of char; str1, str2: string;begin Str1:= ‘АаБбВвГгДдЕеЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя‘; Str2:= ‘юЮаАбБцЦдДеЕфФгГхХиИйЙкКлЛмМнНоОпПяЯрРсСтТуУжЖвВьЬыЫзЗшШэЭщЩчЧъЪ‘; for c := #0 to #255 do Chars[c] := c; for i := 1 to Length(Str1) do Chars[Str2[i]] := Str1[i]; for i := 1 to Length(Text) do Text[i] := Chars[Text[i]]; Result:=Text;end;
Форма ответа