Il modo migliore per rappresentare più risposte JSON in un servizio REST? [chiuso]

0

Sto lavorando a un servizio REST in cui sto cercando di trovare una risposta JSON che dovrei tornare indietro. Di seguito è riportato il disegno che sono in grado di elaborare in cui ogni riga è una risposta per ogni richiesta, quindi abbiamo tre risposte totali per tre richieste racchiuse attorno a un array.

In questo passerò il codice di stato HTTP come 200:

[
    { "response": "{\"hello\":1,\"world\":\"4\"}", "aging": "123456", "bandwidth": "100" , "error": "OK", "status": "SUCCESS" }
    { "response": "{\"hello\":2,\"world\":\"5\"}", "aging": "5432", "bandwidth": "134" , "error": "OK", "status": "SUCCESS" }
    { "response": "{\"hello\":3,\"world\":\"6\"}", "aging": "6789", "bandwidth": "234" , "error": "OK", "status": "SUCCESS" }
]

Allo stesso modo, posso avere anche una risposta inferiore se una richiesta fallisce e inviare il codice di stato HTTP come 202 poiché è una risposta parziale.

[
    { "response": "{\"hello\":1,\"world\":\"4\"}", "aging": "123456", "bandwidth": "100" , "error": "OK", "status": "SUCCESS" }
    { "response": null, "aging": "0", "bandwidth": "0" , "error": "Some Error", "status": "ERROR" }
    { "response": "{\"hello\":3,\"world\":\"6\"}", "aging": "6789", "bandwidth": "234" , "error": "OK", "status": "SUCCESS" }
]

Allo stesso modo, posso avere una risposta inferiore se tutte le richieste falliscono.

[
    { "response": null, "aging": "0", "bandwidth": "0" , "error": "Some Other Error", "status": "ERROR" }
    { "response": null, "aging": "0", "bandwidth": "0" , "error": "Some Error", "status": "ERROR" }
    { "response": null, "aging": "0", "bandwidth": "0" , "error": "Some New Error", "status": "ERROR" }
]

Sto superando la risposta JSON serializzando sotto l'oggetto risposta:

public class TestResponse {

    private final String response;
    private final ErrorCodeEnum error;
    private final StatusCodeEnum status;
    private final String aging;
    private final String bandwidth;

    // .. constructors and getters here
}

Sto cercando di capire, questo è il miglior design per la restituzione della risposta JSON per più casi di risposta in un servizio REST? O c'è un modo migliore per restituire una risposta JSON con tutti i campi appropriati?

L'unico problema che ho è - per una risposta corretta, la mia stringa JSON è sfuggita con le barre nella risposta archiviata nel mio JSON finale. Non sono sicuro che sia un buon approccio nel servizio REST.

Il mio servizio di riposo chiamerà una libreria che sta utilizzando internamente e quella libreria restituirà un elenco e quindi sto serializzando questo elenco in JSON Array come mostrato sopra.

    
posta david 08.12.2015 - 01:54
fonte

1 risposta

3

Bene, se incorpori un identificatore univoco per ogni richiesta, allora puoi rispondere con una classe più strutturata e dare comunque al cliente un modo per sapere quale query ha avuto esito negativo.

public class TestResponse {
    private final List<QueryResponse> responses;
    private final List<QueryError> errors;
    // .. constructors and getters here
}

public class QueryResponse {
    private final int queryID;
    private final String response;
    private final String aging;
    private final String bandwidth;
}

public class QueryError {
    private final int queryID;
    private final int errorCode;
    private final ErrorCodeEnum error;
    private final StatusCodeEnum status;
}

Il punto con questo tipo di organizzazione più intelligente significa che puoi gestire tutte le risposte e gli errori mentre vengono generati e non preoccuparti di trasmettere o analizzare parti inutilmente. per esempio. basta controllare la lunghezza o scorrere tutti gli errori e le risposte.

Se non ti piace che l'ordine delle query riuscite e non riuscite sia suddiviso e desideri mantenere l'ordine di query originale, quindi riorganizzalo in modo che le risposte alle query possano contenere la struttura dei dati di risposta e la struttura dell'errore di risposta. Per ogni QueryResponse verificherebbe solo se l'errore o la risposta sono nulli.

public class QueryResponse {
    private final ResponseData response = null;
    private final ResponseError error = null;
}

public class ResponseData {
    private final String response;
    private final String aging;
    private final String bandwidth;
}

public class ResponseError {
    private final int errorCode;
    private final ErrorCodeEnum error;
    private final StatusCodeEnum status;
}

Spero che questo aiuti. Hai chiesto un parere / idea.

Aggiornamento: con JSON non dovresti essere troppo agganciato al formato trasmesso dei dati. La serializzazione e la deserializzazione dovrebbero occuparsene per te a meno che tu non stia cercando di analizzare il risultato, che dovresti semplicemente evitare se possibile. Ci sono librerie JSON per ogni linguaggio di programmazione là fuori. Non mi dispiaceva usare GSON.

Un esempio di messaggio JSON per l'esempio precedente / precedente potrebbe essere simile a:

[
    {
        "response": {
            "response": "{\"hello\":1,\"world\":\"4\"}",
            "aging": "123456",
            "bandwidth": "100" 
        }, 
        "error": null
    },
    { 
        "response": null, 
        "error": {
            "errorCode": 100,
            "error": "Some Error Enum Value",
            "status": "It's an error, but this should be a message?"
        }
    }
]

Si noti che il nome della variabile "risposta" dovrebbe probabilmente cambiare in modo che non appaia due volte a livelli nidificati diversi. Questo è solo qualcosa che ho digitato a freddo, quindi non è perfetto.

    
risposta data 08.12.2015 - 03:44
fonte

Leggi altre domande sui tag