Как обрабатывать TIdHTTPServer с помощью TIdMultiPartFormDataStream

Привет, мне нужна помощь в том, как получить параметры и данные с помощью IdHttpServer из indy.

многие из моих приложений используют TIdMultiPartFormDataStream для отправки данных через php. Я хотел бы использовать TIdHTTPServer для проверки параметров по какой-то причине и переслать запрос по назначению.

я создал короткий пример для вас, чтобы увидеть.

uses
  IdContext, IdMultipartFormData;

// Server Side------------------------------------------------

IdHTTPServer1.Defaultport := 88;
IdHTTPServer1.active := True;

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  // the request will be pass through its destination by POST/GET
  // and send the result back to the client apps.
  AResponseInfo.ContentText := ARequestInfo.Params.Text;
end;

// Client Side------------------------------------------------
// This will work using the standard Post or Get
procedure TForm1.btnPost1Click(Sender: TObject);
var
  sl: TStringList;
  res: String;
begin
  sl := TStringList.Create;
  try
    sl.Add('Param1=Data1');
    sl.Add('Param2=Data1');
    sl.Add('Param3=Data2');
    sl.Add('Param4=Data3');
    res := IdHTTP1.Post('http://localhost:88/some.php', sl);
    ShowMessage(res);
  finally
    sl.Free;
  end;
end;

//how can i get the parameters and value for this code in my IdHttpServer
procedure TForm1.btnPost2Click(Sender: TObject);
var
  mfd: TIdMultiPartFormDataStream;
  res: String;
begin
  mfd := TIdMultiPartFormDataStream.Create;
  try
    mfd.AddFormField('Param1', 'Data1');
    mfd.AddFormField('Param2', 'Data1');
    mfd.AddFormField('Param3', 'Data2');
    mfd.AddFormField('Param4', 'Data3');
    res := IdHTTP1.Post('http://localhost:88/some.php', mfd);
    ShowMessage(res);
  finally
    mfd.Free;
  end;
end;

и как я узнаю, передают ли клиентские приложения параметр типа TIdMultiPartFormDataStream?


person XBasic3000    schedule 14.06.2012    source источник


Ответы (1)


Об этом уже много раз спрашивали и отвечали на Embarcadero и Индийские форумы. Выполните поиск в их архивах, а также в других архивах, таких как Группы Google, чтобы найти примеры кода.

В двух словах, когда событие TIdHTTPServer.OnCommandGet инициируется, если свойство AResponseInfo.ContentType говорит multipart/form-data (используемая вами версия TIdHTTP.Post() вместо этого будет отправлять application/x-www-form-urlencoded), свойство AResponseInfo.PostStream будет содержать необработанные данные MIME, отправленные клиентом. Вы можете использовать класс TIdMessageDecoderMIME для его разбора. Однако этот класс никогда не предназначался для использования на стороне сервера, поэтому его использование не очень интуитивно понятно, но, тем не менее, это возможно.

В Indy 11 я планирую внедрить нативный multipart/form-data синтаксический анализ непосредственно в TIdHTTPServer, но об этом пока нет ETA, так как мы еще не начали работу над Indy 11.

person Remy Lebeau    schedule 14.06.2012