Comprendere l'associazione di parametri nell'API Web ASP.Net

ASP.Net Web API è un framework leggero che può essere utilizzato per la creazione di servizi HTTP RESTful. Quando si lavora con i metodi del controller nell'API Web, sarà spesso necessario passare i parametri a tali metodi. Un "parametro" qui si riferisce semplicemente all'argomento di un metodo, mentre "associazione di parametri" si riferisce al processo di impostazione dei valori ai parametri dei metodi dell'API Web.

Si noti che esistono due modi in cui l'API Web può associare i parametri: associazione di modelli e formattatori. L'associazione del modello viene usata per leggere dalla stringa di query, mentre i formattatori vengono usati per leggere dal corpo della richiesta. È inoltre possibile utilizzare convertitori di tipi per consentire all'API Web di trattare una classe come un tipo semplice e quindi associare il parametro dall'URI. Per fare ciò, dovresti creare un TypeConverter personalizzato. È inoltre possibile creare un raccoglitore di modelli personalizzato implementando l'interfaccia IModelBinder nella classe e quindi implementando il metodo BindModel. Per ulteriori informazioni sui convertitori di tipi e sui raccoglitori di modelli, dai un'occhiata a questa documentazione Microsoft.

Ora, per associare i parametri, l'API Web segue questa regola: per i tipi semplici, l'API Web tenta di ottenere il valore dall'URI e per i tipi complessi, l'API Web tenta di ottenere il valore dal corpo della richiesta. I tipi semplici qui si riferiscono sia ai tipi primitivi .Net - int, bool, double, float e così via - sia ad altri tipi che includono TimeSpan, DateTime, Guid, decimal e string. Include anche qualsiasi tipo per cui è disponibile un convertitore di tipi che può convertire da una stringa. Nella prossima sezione esploreremo gli attributi [FromBody] e [FromUri] usati per legare i valori rispettivamente dal corpo della richiesta e dall'URI.

Quando utilizzare [FromBody] e [FromUri] nell'API Web

Se utilizzi l'API Web da un po 'di tempo, potresti avere familiarità con gli attributi [FromBody] e [FromUri]. L'attributo [FromUri] è anteposto al parametro per specificare che il valore deve essere letto dall'URI della richiesta e l'attributo [FromBody] viene utilizzato per specificare che il valore deve essere letto dal corpo della richiesta.

Per tutti i tipi primitivi (int, double, float, ecc.), Il runtime dell'API Web tenta di leggere il valore dall'URI della richiesta HTTP. Per i tipi complessi (istanze di classi), il runtime dell'API Web tenta di leggere il valore dal corpo della richiesta HTTP utilizzando un formattatore di tipo multimediale. Questo è il comportamento predefinito dell'API Web. 

Quindi, se nell'URI della richiesta è presente un valore di tipo primitivo, non è necessario specificare l'attributo [FromUri]. Allo stesso modo, se nel corpo della richiesta è presente un valore di tipo complesso, non è necessario specificare l'attributo [FromBody]. Tuttavia, se il tipo primitivo risiede nel corpo della richiesta o il tipo complesso risiede nell'URI della richiesta, è necessario specificare l'attributo [FromBody] o [FromUri]. Il motivo è che in entrambi i casi ti stai allontanando dal comportamento predefinito.

Come utilizzare [FromBody] e [FromUri] nell'API Web

Il frammento di codice seguente illustra come specificare l'attributo [FromBody] per un tipo di dati fondamentale passato come parametro a un metodo API Web.

classe pubblica SecurityController: ApiController

{

    public HttpResponseMessage Post ([FromBody] int id)

    {

       // Scrivi qui il tuo codice

    }

}

Ed ecco uno snippet di codice che illustra come passare un tipo complesso come parametro a un metodo API Web utilizzando l'attributo FromUri.

classe pubblica SecurityController: ApiController

{

    public HttpResponseMessage Post ([FromUri] User user)

    {

       // Scrivi qui il tuo codice

    }

}

Va notato che l'invio di dati di autenticazione utente come nome utente e password tramite l'URI non è una buona pratica, anche se potresti utilizzare SSL. Questo perché tali dati potrebbero essere salvati nei log del browser, dove sono vulnerabili all'esposizione. Quando si trasmettono dati sensibili (nomi utente, password, informazioni sulla carta di credito, ecc.) Tramite il corpo della richiesta, è imperativo utilizzare [FromBody] in ogni caso.

Notare che quando si utilizza l'attributo [FromBody] durante il passaggio di un parametro a un metodo API Web, il runtime dell'API Web sfrutta l'intestazione del tipo di contenuto per selezionare il formattatore corretto. Puoi saperne di più sulla negoziazione del contenuto nell'API Web dal mio articolo qui.