API Web REST: cosa deve essere restituito? NotImplemented, BadRequest o Bad Design?

3

Diciamo che ho un'enumerazione di tipi di informazioni correlate e un'enumerazione di periodi di tempo. Inoltre ho creato due operazioni su un controller per il recupero dei dati di quei tipi di informazioni.

A causa di vincoli dell'API di terze parti, l'InfoA può essere recuperata solo con un intervallo di date e InfoB e InfoC possono essere recuperati solo con un'enumerazione del periodo di tempo. Inoltre, per motivi di estensibilità, ho reso l'InfoType selezionato come parametro in entrambi i percorsi operativi perché so che ulteriori requisiti verranno dal business in un secondo momento e anche perché non voglio creare una nuova operazione per ogni InfoType.

Quindi quando si controlla l'InfoType nell'operazione e si scopre che non è supportato dovrei restituire un HttpStatusCode.NotImplemented o HttpStatusCode.BadRequest a causa di un parametro errato? O questa è una pessima soluzione?

public enum InfoType
{
    InfoA = 0,
    InfoB = 1,
    InfoC = 2,
}

public enum TimePeriod
{
    Previous = 0,
    Current = 1,
}

[Route("api/v1/info/{selectedInfoType:int}/{startDate:datetime}/{endDate:datetime}")]
public HttpResponseMessage Get(InfoType selectedInfoType, DateTime startDate, DateTime endDate)
{
    HttpResponseMessage result;
    string msg = string.empty;

    switch(infoType)
    {
        case InfoType.InfoA:
            result = ...do some work
            break;
        default:
            msg = "Not implemented for this InfoType";
            break;
    }

    if(!string.IsNullOrEmpty(msg))
    {
        result = new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }

    return result;
}

[Route("api/v1/info/{selectedInfoType:int}/{selectedTimePeriod:int}")]
public HttpResponseMessage Get(InfoType selectedInfoType, TimePeriod selectedTimePeriod)
{
    HttpResponseMessage result;
    string msg = string.empty;

    switch(infoType)
    {
        case InfoType.InfoB:
            result = ...do some work
            break;
        case InfoType.InfoB:
            result = ...do some work
            break;
        default:
            msg = "Not implemented for this InfoType";
            break;
    }

    if(!string.IsNullOrEmpty(msg))
    {
        result = new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }

    return result;
}
    
posta meditari 02.03.2017 - 17:29
fonte

2 risposte

4

Il codice di risposta corretto per qualsiasi URL che non esiste è 404. Questa è la situazione che stai descrivendo. Il client chiede un URL per il quale il server non ha risorse.

    
risposta data 02.03.2017 - 18:46
fonte
0

Alcune osservazioni in aggiunta:

  • "501 Not Implemented" dovrebbe essere restituito quando una certa richiesta (metodo) non è implementata affatto (come ad esempio non c'è semplicemente un gestore per una richiesta PUT)

  • "Il metodo 405 non consentito" deve essere restituito quando il gestore di metodo esiste esiste, ma il consumatore dell'API non ha diritti di emissione, ad esempio una richiesta PUT o DELETE per quella specifica risorsa.

  • "400 richiesta errata" deve essere restituita se la richiesta sintatticamente non è corretta, ad esempio contiene JSON o XML non valido

  • Per gli errori di convalida, molte API sembrano utilizzare "409 Conflict" o "422 Unprocessable Entity", sebbene quest'ultima non faccia parte delle specifiche HTTP

Questo è almeno il modo in cui gestiamo queste situazioni.

    
risposta data 14.03.2017 - 21:23
fonte

Leggi altre domande sui tag