Question

Je souhaite avoir des points de terminaison ServiceStack tels que les suivants ...

[RestService("/items/recent")]
[RestService("/items/recent/{Page}")]
[RestService("/items/popular")]
[RestService("/items/popular/{Page}")]

Puisque les deux renverraient un List<Item>, j'aimerais pouvoir avoir les deux dans le même RestServiceBase pour une gestion plus facile du code.Est-ce possible?Si tel est le cas, comment puis-je différencier la demande lorsqu'elle arrive pour savoir s'il s'agissait d'une demande "récente" ou "populaire" afin de pouvoir la traiter de manière appropriée?

Était-ce utile?

La solution

Oui, vous pouvez avoir plusieurs chemins d'accès REST pointant vers le même service Web.

Si vous souhaitez laisser les chemins tels quels, vous pouvez inspecter le chemin de requête utilisé pour appeler le service via HttpRequest, c'est-à-dire:

var httpReq = base.RequestContext.Get<IHttpRequest>();
httpReq.PathInfo //or httpReq.RawUrl, httpReq.AbsoluteUri, etc.

La façon dont vous déterminez de quel type de demande il s’agit consiste à examiner le DTO de demande renseigné, mais pour faire la distinction entre / récent / et / populaire / vousdevrait le stocker dans une autre propriété Request DTO, puis inspecter ses valeurs, c'est-à-dire

[RestService("/items/{Type}")]
[RestService("/items/{Type}/{Page}")]
public class Items
{
    public string Type { get; set; }
    public int? Page { get; set; }
}

public class ItemsService : ServiceBase<Items>
{
    public override object Run(Items request)
    {
        if (request.Type == "recent")
           if (!request.Page.HasValue) 
              //path 1
           else
              //path 2
        else if (request.Type == "popular")
           if (!request.Page.HasValue) 
              //path 3
           else
              //path 4
    }
}

Ceci est également similaire à cette question StackOverflow: Besoin d'aide sur la mise en œuvre de servicestack

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top