javascript - URL pentru construirea TypeScript cu argumente opționale


Încerc să construiesc un URL pentru a prelua date de la un serviciu REST, un URL valid ar trebui să arate astfel

http://SITENAME/api/get_posts/?count=5&page=1&post_type=gallery

și am argumente precum count, page, post_type și altele.. acestea sunt argumente opționale și unul sau toate ar putea fi nule Am încercat următorul cod

var query = 'http://localhost/wptest/api/get_posts/?';
fetchData(countIn: int, pageIn: int, typeIn: string, query: string) {

    if (this.countIn)   //if count not null, add count parameter.
        query = `${query}&count=${this.countIn}`;
    if (this.pageIn)  
        query = `${query}&page=${this.pageIn}`;
    if (this.typeIn)  
        query = `${query}&post_type=${this.typeIn}`;

    return this.http.get(query).map(res => res.json());
}

acest cod urât returnează un URL invalid, când merg în debugger-ul Chrome => fila rețea găsesc:

totuși nu primesc o excepție, pentru că cumva URL-ul se repară și trimite o nouă cerere cu URL-ul valid:

problema este cu diferența dintre ?count=5&page=1 și ?&count=5&page=1

asta cauzând ca indicatorul de încărcare al filei să rămână blocat și să nu se termine niciodată.

Î: ce îmbunătățiri se pot face codului pentru a obține un URL valid?

Răspuns #1

Păstrând structura generală a codului tău actual, ai putea adăuga o variabilă care să fie setată cu '&' după prima utilizare a acesteia.

fetchData(countIn: int, pageIn: int, typeIn: string, query: string) {
    var prepend = '';
    if (this.countIn)  { 
        query = `${query}` + prepend + `count=${this.countIn}`;
        prepend = '&';
    }
    if (this.pageIn)  {
        query = `${query}` + prepend + `page=${this.pageIn}`;
        prepend = '&';
    }
    if (this.typeIn)  {
        query =  `${query}` + prepend + `post_type=${this.typeIn}`;
        prepend = '&';
    }

    return this.http.get(query).map(res => res.json());
}

Există și alte moduri de a realiza ceea ce încerci să obții, dar aceasta este o modalitate de a face acest lucru.

Răspunsul #2

var params = [], // your params here
    self = this;
[["count", "countIn"], ["page", "pageIn"], ["post_type", "postIn"]]
  .forEach(function(param) { 
     if(self[param[1]]) params.push(param[0] + "=" + self[param[1]]); 
  });
var query = `${query}` + params.join("&");