4

こんにちは、インディから IdHttpServer を使用してパラメーターとデータを取得する方法について助けが必要です。

私のアプリケーションの多くは 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 型のパラメーターを渡すかどうかをどのように知ることができますか?

4

1 に答える 1

3

これは、 EmbarcaderoおよびIndyフォーラムで何度も質問され、回答されています。コード例を見つけるには、アーカイブやGoogle グループなどの他のアーカイブを検索してください。

簡単に言えば、TIdHTTPServer.OnCommandGetイベントがトリガーされたときに、AResponseInfo.ContentTypeプロパティが示す場合multipart/form-data(使用しているバージョンが代わりTIdHTTP.Post()に送信されます) 、クライアントが投稿した未加工の MIME データがプロパティに含まれます。クラスを使用して解析できます。ただし、そのクラスはサーバー側で使用することを意図したものではないため、直感的に使用することはできませんが、それでも可能です。application/x-www-form-urlencodedAResponseInfo.PostStreamTIdMessageDecoderMIME

Indy 11 では、ネイティブmultipart/form-data解析をそれ自体に直接実装する予定ですTIdHTTPServerが、Indy 11 の作業をまだ開始していないため、まだ ETA はありません。

于 2012-06-14T02:49:48.567 に答える