Autore Topic: Conferma http  (Letto 155 volte)

Offline wlf

  • Utente normale
  • ***
  • Post: 373
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Conferma http
« il: 22 Marzo 2018, 15:09:08 CET »
0
Salve,
comunicando in http, essendo asincrono, come si fa ad avere certezza che una richiesta http sia completata da entrambe i lati?

Nel caso io faccia una post inviando informazioni al server ho la response che dovrebbe farmi capire se le informazioni sono arrivate dall'altro capo.

App -- post --> Server
Server -- response --> App

In questo caso potrebbe accadere che il Server abbia ricevuto i dati ma per qualche motivo l'App si sia persa la response? Se il server tra la ricezione e l'invio della response dovesse fare qualche operazione che va in exception in questo caso potrebbe aver ricevuto i dati senza essere riuscito a confermarli con una response. Quindi l'App non avendo ricevuto una response potrebbe rischiare di postare ancora gli stessi dati.

Viceversa nel caso di una get chiedendo ad un server se ci sono nuove informazioni da inviare all'App potrei avere:

App -- get --> Server
Server -- response --> App

In questo caso l'App potrebbe:
- Aver ricevuto la response e quindi il server non deve più rispondere inviando nuovamente gli stessi dati.
- Essersi persa la response e quindi alla prossima get il server dovrebbe rimandarle i dati che si è persa precedentemente.

Quindi l'App dovrebbe in qualche modo comunicare al server di aver ricevuto le informazioni perché altrimenti la prox volta questo comunicherà nuovamente le stesse informazioni pensando che l'App non le abbia ricevute. Per fare questo aggiungerei nuovamente una post di conferma della ricezione della get:

App -- post --> Server
Server -- response --> App

Se l'App non riceve una response avrebbe  ancora il dubbio che il server non abbia recepito la conferma, quindi dovrebbe continuare a mandare una post di conferma finché non riceve una response.

Esiste qualche "use-case" di come si gestisce questa casistica? Che un App voglia inviare una informazione ad un server e che ne debba ricevere una (output & input).

Grazie.

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Conferma http
« Risposta #1 il: 22 Marzo 2018, 17:01:25 CET »
0
Ciao,
Citazione
comunicando in http, essendo asincrono, come si fa ad avere certezza che una richiesta http sia completata da entrambe i lati?

in realtà l'http non è sincrono o asincrono (http è il protocollo di comunicazione), è la richiesta che costruisci che puoi farla sia asincrona che sincrona (dipende da che classi/librerie utilizzi). In generale, nell'ipotesi di una richiesta asincrona, di solito si ha la possibilità di definire un listener che intercetta la risposta del server. Per esempio, io uso una libreria (che trovi qui) che ti permette di creare richieste asincrone, questo è un semplice esempio preso dalla home page della libreria:

Codice (Java): [Seleziona]
AsyncHttpClient client = new AsyncHttpClient();
client.get("https://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
        }
});

Come vedi nel "AsyncHttpResponseHandler" puoi scrivere codice che viene eseguito nei vari step della richiesta; in particolare nell'onSuccess e nell'onFailure intercetti le risposte ricevute dal server.

Citazione
In questo caso potrebbe accadere che il Server abbia ricevuto i dati ma per qualche motivo l'App si sia persa la response
Per rispondere a questa domanda, torno a dirti che dipende da come hai implementato il tuo codice. Se mi dovessi basare sull'esempio  che ti ho fatto sopra, mi perderei la risposta se non scrivo codice nei listener onsuccess/onfailure; in questo caso il server mi risponderebbe ma io non faccio niente con la risposta ricevuta.

Citazione
Se il server tra la ricezione e l'invio della response dovesse fare qualche operazione che va in exception in questo caso potrebbe aver ricevuto i dati senza essere riuscito a confermarli con una response. Quindi l'App non avendo ricevuto una response potrebbe rischiare di postare ancora gli stessi dati.
In realtà se la tua richiesta (get o post che sia) scatena una exception lato server, la risposta il server te la manda indietro lo stesso; come detto prima tu devi cmq intercettarla (senza inventare niente, basta implementare il codice che la librarie o le classi java ti forniscono). Considera che quando fai una richiesta, è come se fossi un browser e il tutto si comporta alla stessa maniera: se accade un errore, sul browser visualizzeresti lo stack-trace dell'errore (o ciò che hai detto al server di restituire), lo stesso accadrebbe via codice.

Citazione
In questo caso l'App potrebbe:
- Aver ricevuto la response e quindi il server non deve più rispondere inviando nuovamente gli stessi dati.
- Essersi persa la response e quindi alla prossima get il server dovrebbe rimandarle i dati che si è persa precedentemente.
No, se ho capito bene quello che intendi, non funziona così: nel protocollo http la logica è domanda del client -> risposta dal server. Se il client rimane in attesa riceve la risposta, altrimenti si perde il tutto. Il server la risposta te la manda indietro sempre e comunque, se poi il client non è più presente per riceverla al server non interessa.

Spero di averti risposto, se hai altri dubbi o se non sono stato chiaro chiedi pure.
Paolo