Witam serdecznie.
Mam klasy napisane w javie, ktore odwoluja sie do serwisu internetowego poprzez SOAP i uzyskuja pewne dane..
Mam rowniez aplikacje napisana w delphi, w ktorej te dane chcialbym dalej przetwarzac.
Czy istnieje jakies eleganckie rozwiazanie?
Dziekuje z gory za jakiekolwiek sugestie...
przecież Delphi normalnie obsługuje SOAP https://www.google.pl/search?q=delphi+soap
Niestyty nie mam dostepu do pliku definicji WSDL..
Ale tak jak napisalem posiadam JavaApi gdzie zaimplementowane sa klasy do obslugi serwisu i korzystania z danych.
Jakis pomysl?
Dzieki
Czarny Lew napisał(a):
Niestyty nie mam dostepu do pliku definicji WSDL..
Ale tak jak napisalem posiadam JavaApi gdzie zaimplementowane sa klasy do obslugi serwisu i korzystania z danych.
Jakis pomysl?
Przepisać ręcznie na delphi - powodzenia. Nie znam narzędzia/sposobu/czegokolwiek co by pozwalało pod delphi podpiąć jave. Możesz w javie napisać jakieś narzędzie, które odbierze dane z serwisu i przygotuje je dla delphi w jakiejś "zjadliwej" formie (xml, txt np.)
Z tym że napracujesz się z tym znacznie więcej niż podczas przepisania.
Bibliotek do obsługi SOAP jest multum, na WSDL świat się nie kończy.
Tak jak napisał poprzednik. Masz javę którą odpytuje jakieś API i dostaje wyniki.
Masz delphi które przetwarza wyniki.
Wiec twoj problem polega na tym jak przekazac wyniki z javy do delphi.
chyba ze chcesz miec tylko 'jeden program'. To trzeba przepisać w jedną lub drugą stronę kod.
Eksportuj w javie dane do pliku, a w delphi je odczytuj.
Wlasnie zabralem sie za Jave... sprobuje wywolanie z argumentem bez formy i zapisanie danych do pliku. Po stronie Delphi obserwowanie zmiany pliku i wtedy przetwarzanie danych.... mam nadzieje ze samo wywolanie javy nie bedzie zbyt dlugo trwalo
Czemu początkujące z dwóch wariantów jeden prosty drugi prawie niemożliwy do poprawnego zrealizowania zawsze wybierają ten drugi?
http://sourceforge.net/projects/indysoap/
Zainstaluj sobie i działaj.
Jeśli bawisz się z WS w delphi i tak jak ja korzystasz z Delphi7 to nie dziwię się dlaczego próbujesz wykorzystać klasy napisane w Javie :).
Delphi nie ze wszystkich sobie radzi, a już z pewnością nie wbudowana obsługa SOAP z Delphi7. Aby połączyć się np z kurierem FedEx musiałem się nieźle nakombinować.
Ale wracając do tematu. Ja również mam podobną aplikację, gdzie mam interfejs w Delphi, który pod spodem odpala klasy Javy. W moim przypadku to działa tylko dlatego, że klasa javy, którą wykorzystuję jest napisana w taki sposób, że można ją obsługiwać z konsoli zatem przyjmuje wartości jako parametry, a na końcu zwraca odpowiedni ciąg znaków.
Poniżej przykładowy kod:
procedure CaptureConsoleOutput(DosApp : string; var wynik : string);
const
ReadBuffer = 1048576; // 1 MB Buffer
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pansichar;
TotalBytesRead,
BytesRead : DWORD;
Apprunning,n,
BytesLeftThisMessage,
TotalBytesAvail : integer;
begin
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if CreatePipe (ReadPipe, WritePipe, @Security, 0) then
begin
// Redirect In- and Output through STARTUPINFO structure
SetCurrentDir(ExtractFileDir( ParamStr(0)) ) ;
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0); //!!wazne
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
// Create a Console Child Process with redirected input and output
//UniqueString(DosApp);
if CreateProcess( nil ,
PChar(DosApp),
@Security,@Security,
true ,
CREATE_NO_WINDOW + NORMAL_PRIORITY_CLASS,
nil,
nil,
//pchar(ExtractFileDir(DosApp)),
start ,ProcessInfo) then
begin
n:=0;
TotalBytesRead:=0;
repeat
// Increase counter to prevent an endless loop if the process is dead
Inc(n,1);
// wait for end of child process
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
// it is important to read from time to time the output information
// so that the pipe is not blocked by an overflow. New information
// can be written from the console app to the pipe only if there is
// enough buffer space.
if not PeekNamedPipe(ReadPipe ,@Buffer[TotalBytesRead],ReadBuffer ,@BytesRead,@TotalBytesAvail,@BytesLeftThisMessage) then
break
else if BytesRead > 0 then
ReadFile(ReadPipe,Buffer[TotalBytesRead],BytesRead,BytesRead,nil);
TotalBytesRead:=TotalBytesRead+BytesRead;
until (Apprunning <> WAIT_TIMEOUT) or (n > 250);
// Buffer[TotalBytesRead]:= #0;
// OemToChar(Buffer,Buffer);
// SetLength(res,TotalBytesRead);
// OemToChar(Buffer,PChar(res));
wynik := string(Buffer);
if not ((Length(wynik) > 4) and (Length(wynik)<10)) then
wynik := 'ERROR';
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var w : string ;
begin
if OpenDialog1.Execute()then
if OpenDialog1.FileName <> '' then
begin
Image321.Bitmap.LoadFromFile(OpenDialog1.FileName);
SetCurrentDir(ExtractFilePath(Application.ExeName));
CaptureConsoleOutput('java -jar javaanpr.jar -recognize -i "' + OpenDialog1.FileName + '"' ,w);
Label1.Caption := w;
end;
end;
Jakość kodu nie jest porywająca gdyż to jest demo przygotowane na potrzeby prezentacji dla klienta.