2012-06-14 3 views
4

안녕하세요, indy에서 IdHttpServer를 사용하여 매개 변수와 데이터를 검색하는 방법에 대한 도움이 필요합니다.TIdHTTPServer를 TIdMultiPartFormDataStream으로 처리하는 방법

많은 응용 프로그램에서 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 유형을 전달하는지 어떻게 알 수 있습니까?

답변

3

이 질문은 전에 EmbarcaderoIndy 포럼에서 여러 번 묻고 대답했습니다. 코드 예제를 찾으려면 Google Groups과 같은 다른 아카이브뿐만 아니라 해당 아카이브를 검색하십시오. AResponseInfo.ContentType 속성 multipart/form-data (대신 application/x-www-form-urlencoded을 보내드립니다 사용하는 TIdHTTP.Post()의 버전)을 말합니다 경우 TIdHTTPServer.OnCommandGet 이벤트가 트리거 간단히 말해서,에서

AResponseInfo.PostStream 속성은 클라이언트가 게시하는 원시 MIME 데이터를 포함합니다. TIdMessageDecoderMIME 클래스를 사용하여 파싱 할 수 있습니다. 그러나이 클래스는 결코 서버 측에서 사용되지 않으므로 사용하기가 쉽지는 않지만 그럼에도 불구하고 가능합니다.

Indy 11에서 고유 한 multipart/form-data을 직접 구현하여 TIdHTTPServer으로 직접 파싱 할 계획이지만 아직 Indy 11에서 작업을 시작하지 않았으므로 아직 ETA가 없습니다.