SOAP и Attachment

Roman_80
Дата: 26.04.2011 09:21:25
Помогите пожалуйста, сроки горят!
Есть сервер, который принимает данные + атачмент.
Нужно с клиента отправить данные через SOAP и вложить атачмент.

пользуюсь компонентой THTTPRIO (htpr1)

procedure TForm1.btn1Click(Sender: TObject);
var x:DsiPortType;
    Docid:Int64;
begin
   Docid = 123;
   x := htpr1 as DsiPortType;
   x.importDoc('Login1',
             'pass1',
             Docid 
             ) ;
end;

нашел класс TSoapAttachment, но не понятно как с ней работать и как вложить файл.
Кто с этим сталкивался, помогите пожалуйста.
Заранее спасибо.
a_titeev
Дата: 26.04.2011 11:40:12
Roman_80,

в D'7 когда все это появилось сэмплы прям были... попробуй поищи там. сейчас семерки нет под рукой.
Roman_80
Дата: 27.04.2011 10:57:36
Посмотрел демки по Indy, ничего не нашел. Скачал компоненту IEHTTP.
Запрос отправляется нормально, но с вложенным файлом тоже ничего не выходит.
В компоненте есть метод
ihtp1.AddMultipartFile('attach', 'C:\tmp\!.txt');

я выполняю, снифером ловлю запрос, но файла нет. Кто сталкивался, подскажите пожалуйста как решить вопрос?
a_titeev
Дата: 27.04.2011 15:59:09
Roman_80,

надо было демки по soap смотреть
Roman_80
Дата: 28.04.2011 15:13:55
У меня почти все заработал. Только вот пока не могу разобраться как файлы вложить.

есть процедурка:

+
procedure TForm1.btn3Click(Sender: TObject);
var
 ResponseStream:TStringStream;
 PostStream:TStringStream;
 s:string;
begin
 ResponseStream:=TStringStream.Create('');
 PostStream := TStringStream.Create('');
 try
   PostStream.Position:=0;
   PostStream.WriteString(

  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://dsi.ws.rjd.ru/schemas"> '+
  '<soapenv:Header/> '+
  '<soapenv:Body> '+
  '<sch:ImportDocRequest> '+
  '<sch:login>login1</sch:login> '+
  '<sch:password>100026</sch:password> '+
  '</sch:ImportDocRequest> '+
  '</soapenv:Body> '+
  '</soapenv:Envelope> '

   );

   idhtp1.post('http://172.16.0.24:8081/ACTROOT/',PostStream , responsestream);
   Mmo1.Lines.Add(idhtp1.ResponseText);
   Mmo1.Lines.Add(Utf8ToAnsi(ResponseStream.DataString));
  finally
     ResponseStream.Free;
     PostStream.Free;
  end;

end;


как в запрос вложить файл, подскажите, пожалуйста....
Кроик Семён
Дата: 28.04.2011 16:01:13
Roman_80,

дела не имел, но вот просматривая приведенный выше код, заметил странность:
dhtp1.post('http://172.16.0.24:8081/ACTROOT/',PostStream , responsestream);
Mmo1.Lines.Add(idhtp1.ResponseText);
Mmo1.Lines.Add(Utf8ToAnsi(ResponseStream.DataString));
<КОНЕЦ>

Код такой, как будто ты ЧИТАЕШЬ файл, а не ОТПРАВЛЯЕШЬ

с компонентой не знаком, но все-равно, как то не понятно, почему

1) почему пытаешься вложить Attachment уже после idhtp1.post(...)
2) почему ничего не происходит с Mmo1.Lines, откуда вообще взялся этот Mmo1 и что с ним делать
Roman_80
Дата: 28.04.2011 16:16:14
Mmo1 - Это TMemo на форме
В responsestream возвращается ответ от сервера, сервер возвращает XML.
Я хочу вложить еще и файл в это вложение, но не знаю как.

Пробовал использовать TIdMultiPartFormDataStream, тут есть метод
TIdMultiPartFormDataStream.AddFile, но теперь непонятно как вложить XML. Они должны вместе отправиться.

Вот пример

+
procedure TForm1.btn4Click(Sender: TObject);
var
 ResponseStream:TStringStream;
 PostStream:TIdMultiPartFormDataStream;
 s:string;
begin
 ResponseStream:=TStringStream.Create('');
 PostStream := TIdMultiPartFormDataStream.Create;
 try
   PostStream.Position:=0;

   PostStream.
   PostStream.AddFile('!.txt','c:\tmp\!.txt', '');


   idhtp1.post('http://172.16.0.24:8081/ACTROOT/', PostStream, responsestream);

   Mmo1.Lines.Add(idhtp1.ResponseText);
   Mmo1.Lines.Add(Utf8ToAnsi(ResponseStream.DataString));
  finally
     ResponseStream.Free;
     PostStream.Free;
  end;

end;


кто с этим сталкивался? Помогите пожалуйста...
Кроик Семён
Дата: 28.04.2011 17:47:44
(Как я и предполагал, файл нужно готовить до вызова .Post())
если так поискать, то вылетает куча ссылок, одна из которых Re: Using TidHTTP to upload file:

Re: Using TidHTTP to upload file
автор

I've dug around and found an example of file upload using
TidHTTP but it glosses over the part I can't do!



You are posting the file completely wrong. You do not have to format
the data manually. You should be using the TIdMultipartFormDataStream
class instead. Post() has an overloaded version available that
accepts a TIdMultipartFormDataStream as input, for example:

procedure TForm1.SendPostData;
var
   Stream: TStringStream;
   Params: TIdMultipartFormDataStream;
begin
   try
      Stream := TStringStream.Create('');
      try 
         Params := TIdMultipartFormDataStream.Create;
         try
            Params.AddFile('File1', 'C:\A\kk.txt', 'application/octet-stream');
            try
               HTTP.Post('http://localhost/upload.php', Params, Stream);
            except
               on E: Exception do
                  ShowMessage('Error encountered during POST: ' + E.Message);
            end;
            
            ShowMessage(Stream.DataString);
         finally
            Params.Free;
         end;
      finally
         Stream.Free;
      end;
   except
   end;
end;



I am using Delph7 and whatever set of Indy components arrived with that.
Then I suggest you upgrade, as that is an old version of Indy.

Gambit
Roman_80
Дата: 29.04.2011 09:12:01
все получилось, всем спасибо!!!

procedure TForm1.btn5Click(Sender: TObject);
var
 ResponseStream:TStringStream;
 PostStream     : TIdMultiPartFormDataStream;
 sMimeType      : String;
 XMLTEXT, sAttach:string;
begin
 ResponseStream:=TStringStream.Create('');
 PostStream :=   TIdMultiPartFormDataStream.Create;
 sAttach := 'c:\tmp\!.zip';
 sMimeType := GetMIMETypeFromFile(sAttach);


 XMLTEXT:=
  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://dsi.ws.rjd.ru/schemas"> '+#10+#13+
  '  <soapenv:Header/> '+#10+#13+
  '    <soapenv:Body> '+#10+#13+
  '      <sch:ImportDocRequest> '+#10+#13+
  '        <sch:login>chuma</sch:login> '+#10+#13+
  '        <sch:password>100026</sch:password> '+#10+#13+
  '      </sch:ImportDocRequest> '+#10+#13+
  '    </soapenv:Body> '+#10+#13+
  '</soapenv:Envelope> ';


 try
   PostStream.Position:=0;
   PostStream.AddFormField('XML',XMLTEXT);
   PostStream.AddFile( ExtractFileName(sAttach), sAttach, sMimeType);
   idhtp1.post('http://172.16.0.10:8080/ACTROOT/',PostStream , responsestream);
   Mmo1.Lines.Add(idhtp1.ResponseText);
   Mmo1.Lines.Add(Utf8ToAnsi(ResponseStream.DataString));
  finally
     ResponseStream.Free;
     PostStream.Free;
  end;

end;
didgik
Дата: 28.10.2015 20:52:01
Некропостинг )

А тоже самое, но без TIdMultiPartFormDataStream можно как то сделать?
А то на моём C++ Builder 6 такого нет.