Possiedo un dispositivo che utilizza servizi Web riposanti e che ho utilizzato la sua funzionalità di richiesta/risposta con cui invio un comando tramite HTTP GET e risponde con l'XML appropriato.Come si ricevono le notifiche push con Indy?
Ora devo utilizzare le notifiche pus del dispositivo. Ho provato lo stesso approccio di cui sopra in cui fornisco la procedura TIdHTTP.Get
con l'URL HTTP pertinente e lo stream in cui inserire la risposta, ma questo non sembra funzionare. La chiamata a Get
non torna indietro. Questo ha senso per me in quanto con le notifiche push si sta aprendo un flusso HTTP di comunicazione tra il dispositivo e il programma e questa connessione rimarrà aperta per lo streaming fino alla chiusura.
Il mio problema è che non so come ottenere l'XML dallo stream se il metodo Get
non restituisce. È come se il programma fosse bloccato. Ho provato a mettere la comunicazione tramite GET con il dispositivo e la lettura dello stream in un thread in modo che questo possa continuare da solo e quindi la mia applicazione principale può semplicemente controllare l'XML risultante, ma anche questo non funziona.
Mi chiedo se sono troppo complicato e se c'è una soluzione semplice. Quando invio semplicemente una richiesta e ottengo una risposta, funziona correttamente; è solo lo streaming push che non riesco a far funzionare.
Se utilizzo l'URL in Internet Explorer, è possibile vedere l'XML restituito e il logo "occupato" costantemente in esecuzione che indica che lo streaming è aperto.
Ho eseguito il comando tramite il mio browser Firefox Mozilla 20.0.1 e ho visto ciò che wireshark acquisisce per la richiesta push e la risposta. La parte HTTP è la seguente:
GET /elite/notifications/stream?resume=2013-05-06T00:00:00Z HTTP/1.1
Host: 192.168.10.10
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
La richiesta che sto cercando di fare in Delphi è la seguente:
if fEventStream = nil then
fEventStream := TStringStream.Create('');
try
TapItem.fHTTP.Get(TapItem.I2IReaderIP+'/elite/notifications/stream?resume=2013-05-01T00:00:00Z',fEventStream);
TapItem.fEventXML := fEventStream.ReadString(fEventStream.Size);
except
on e:exception do begin
ShowMessage(e.message)
end;
end;
ho anche provato con TidTCPConnection
fTCPConn.IOHandler.Writeln(TapItem.I2IReaderIP+I2I_PUSH_EVENT+'2013-05-01T00:00:00Z');
While not Terminated do begin
XMLString := XMLString + fTCPConn.IOHandler.Readln;
end;
Tutta l'assistenza in questa questione sarebbe apprezzata.
SOLUZIONE
Nel mio caso la semplice aggiunta la parola chiave GET per l'inizio della chiamata ha funzionato. Ho assunto la componente connessione TCP richiede la conoscenza di quale azione (cioè avere messo ecc) è che si desidera fare, cant leggere la mia mente, ha senso
fTCPConn.IOHandler.Writeln('GET ' + TapItem.I2IReaderIP+I2I_PUSH_EVENT+'2013-05-01T00:00:00Z');
While not Terminated do begin
XMLString := XMLString + fTCPConn.IOHandler.Readln;
end;
Suggerimento: su Stackoverflow, è possibile aggiungere la soluzione come risposta (e accettarla) – mjn