Produces Plain Text: valore RAW ed addio double quotes

L’esistenza del filtro Produces mi era nota, ma non avevo mai avuto l’occasione di utilizzarlo. L’esempio che seguira’ e’ tratto da un caso realmente successo durante un mio sviluppo.

La mia situazione era semplice:

  • Ho un codice (var string …)
  • Chiamo una API passando quel valore
  • API torna un secondo codice (string)
  • Su questo valore effettuo uno switch per mostrare un messaggio all’utente.

Il problema si e’ visto subito alla prima chiamata. Il valore a video non era quello atteso, ma quello di default. Perche’? Eppure ho mappato tutto.

Produces: chi sei?

Produces e’ un filtro ed e’ possibile applicarlo sia alla singola chiamata API che globalmente. Nel nostro caso vedremo solamente l’applicazione mirata.

Produces permette di tornare un dato RAW in un formato specifico (vedi sotto) senza l’aggiunta di altri caratteri.

Tornando al mio caso la situazione era la seguente

  • valore di ritorno “ERR01”
  • valore che cercavo ERR01

A quel punto mi sono ricordato del Produces ed ho deciso di utilizzarlo.

Produces: Come funzioni?

Non credo servano molte parole, l’esempio a seguire e’ auto parlante

1
2
3
4
5
[HttpGet, Produces("text/plain")]
public async Task<string> Get(string code)
{
    return await GetDescriptionByCode(code);
}

(For EN friends: this is the solution for ‘api result without double quoting’)

In questo modo mi verra’ tornato un testo puro in valore RAW senza doppi apici di contorno.

Nel mio caso ho passato text/plain, ma sappiate che non e’ la sola possibilta’. Un esempio? Il content type per il json (application/json) e’ un altro formato comodo da utilizzare.

Produces: Definizione

Ecco la definizione del Produces

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
namespace Microsoft.AspNetCore.Mvc
{
    //
    // Summary:
    //     A filter that specifies the expected System.Type the action will return and the
    //     supported response content types. The Microsoft.AspNetCore.Mvc.ProducesAttribute.ContentTypes
    //     value is used to set Microsoft.AspNetCore.Mvc.ObjectResult.ContentTypes.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class ProducesAttribute : Attribute, IApiResponseMetadataProvider, IFilterMetadata, IOrderedFilter, IResultFilter
    {
        //
        // Summary:
        //     Initializes an instance of Microsoft.AspNetCore.Mvc.ProducesAttribute.
        //
        // Parameters:
        //   type:
        //     The Microsoft.AspNetCore.Mvc.ProducesAttribute.Type of object that is going to
        //     be written in the response.
        public ProducesAttribute(Type type);
        //
        // Summary:
        //     Initializes an instance of Microsoft.AspNetCore.Mvc.ProducesAttribute with allowed
        //     content types.
        //
        // Parameters:
        //   contentType:
        //     The allowed content type for a response.
        //
        //   additionalContentTypes:
        //     Additional allowed content types for a response.
        public ProducesAttribute(string contentType, params string[] additionalContentTypes);

        //
        // Summary:
        //     Gets or sets the supported response content types. Used to set Microsoft.AspNetCore.Mvc.ObjectResult.ContentTypes.
        public MediaTypeCollection ContentTypes { get; set; }
        public int Order { get; set; }
        public int StatusCode { get; }
        public Type Type { get; set; }

        public virtual void OnResultExecuted(ResultExecutedContext context);
        public virtual void OnResultExecuting(ResultExecutingContext context);
        public void SetContentTypes(MediaTypeCollection contentTypes);
    }
}

Ora -se volete- non vi resta che leggeree per maggiore informazione la documentazione ufficiale. Personalmente vi consiglio di non abusarne ed usarlo solamente in casi mirati senza renderlo attivo su ogni chiamata API.