2014-09-28 7 views
5

Attualmente nel mio servizio Rest restituisco i dati paginati utilizzando il modello che segue.Aggiunta di impaginazione per collegare le intestazioni in Web Api 2

public class PagedResults<T> 
{ 
    public List<LinkModel> Links { get; set; } 
    public int TotalCount { get; set; } 
    public double TotalPages { get; set; } 
    public List<T> Results { get; set; } 
} 

Questo funziona bene, ma mi sono imbattuto nel seguente post.

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pagination

La mia curiosità era visiera, si parla utilizzando le intestazioni HTTP per tornare link e informazioni impaginazione. Sebbene il post menzioni la RFC 5988, non sono stato in grado di capire cosa significhi realmente? Era effettivamente adottato come standard di qualche tipo?

La domanda qui è in ASP.Net Web API 2, c'è qualche supporto per l'aggiunta di informazioni di paginazione nell'intestazione del collegamento? Ho usato intellisense per esaminare le intestazioni di risposta HTTP e non ho trovato collegamenti o qualcosa di simile.

ho trovato questo post, ma in realtà non rispondere alla mia domanda di facilità di fare questo in API Web 2.

Link headers vs link elements for RESTful JSON

risposta

12

È possibile controllare il mio post here che mostra come aggiungere la paginazione come " custom"(X-impaginazione) un colpo di testa, sotto è il codice di esempio che potrebbe aiutare:

public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10) 
{ 
    IQueryable<Student> query; 

    query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName); 

    var totalCount = query.Count(); 
    var totalPages = (int)Math.Ceiling((double)totalCount/pageSize); 

    var urlHelper = new UrlHelper(Request); 
    var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : ""; 
    var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : ""; 

    var paginationHeader = new 
    { 
     TotalCount = totalCount, 
     TotalPages = totalPages, 
     PrevPageLink = prevLink, 
     NextPageLink = nextLink 
    }; 

    System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination", 
    Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader)); 

    var results = query 
    .Skip(pageSize * page) 
    .Take(pageSize) 
    .ToList() 
    .Select(s => TheModelFactory.CreateSummary(s)); 

    return results; 
} 
+0

Grazie, questo sembra quello che stavo cercando. Solo per il mio chiarimento, però, X-Pagination è un'intestazione standard, dici di intestazione personalizzata nella tua risposta? Quindi questo non è qualcosa di abbastanza comune da avere il proprio header dedicato? – GetFuzzy

+0

Nessuna intestazione personalizzata, qualsiasi intestazione inizia con X di solito non è un'intestazione HTTP standard. –

+1

sarebbe meglio utilizzare le intestazioni dei collegamenti? http://tools.ietf.org/html/rfc5988#page-6 – user80855

0

In .Net MVC intestazioni di collegamento aggiunta è banale. Secondo il IETF essi vengono separati da una virgola, quindi:

HttpContext.Response.Headers.Add("Link", string.Join(",", pagedResult.Links)); 

Nota: che pagedResult è in un'istanza della classe PagedResult<T>.

Questo può essere utilizzato in combinazione con le intestazioni di Taiseer X-Pagination sopra.

Problemi correlati