Я пытаюсь создать URL для извлечения данных из службы REST, действительный URL должен выглядеть следующим образом

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

И у меня есть аргументы, такие как count , страница , post_type и другие .. это необязательные аргументы, и один или все могут быть нулевыми Я пробовал следующий код

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());
}

Этот уродливый код возвращает неверный URL, когда я захожу в отладчик chrome => вкладка сети, я нахожу:

enter image description here

Однако я не получаю исключения, потому что каким-то образом URL-адрес фиксируется и отправляет новый запрос с действительным URL-адресом:

enter image description here

Проблема в разнице между ?count=5&page=1 и ?&count=5&page=1

Это приводит к застреванию счетчика и никогда не заканчивается.

enter image description here

В: какие улучшения можно внести в код, чтобы получить действительный URL-адрес?

4
Murhaf Sousli 17 Дек 2015 в 18:26

3 ответа

Лучший ответ

Сохраняя общую структуру вашего текущего кода, вы можете добавить переменную, которая устанавливается с '&' после первого использования.

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());
}

Есть и другие способы достичь того, чего вы пытаетесь достичь, но это один из способов сделать это.

3
devlin carnate 17 Дек 2015 в 15:37

Пытаться :

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

if (this.countIn && counter = 0){  //if count not null, add count parameter.
    query = `${query}count=${this.countIn}`;
counter++;
}
elseif(this.countIn){  //if count not null, add count parameter.
    query = `${query}&count=${this.countIn}`;
} 

if (this.pageIn && counter = 0){  //if count not null, add count parameter.
    query = `${query}count=${this.pageIn}`;
counter++;
}
elseif(this.pageIn){  //if count not null, add count parameter.
    query = `${query}&count=${this.pageIn}`;
} 

if (this.typeIn && counter = 0){  //if count not null, add count parameter.
    query = `${query}count=${this.typeIn}`;
counter++;
}
elseif(this.typeIn){  //if count not null, add count parameter.
    query = `${query}&count=${this.typeIn}`;
} 



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

    query = `${query}&post_type=${this.typeIn}`;

Это обходной путь, я верю.

0
Dray 17 Дек 2015 в 15:46
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("&");
2
Mike Vitik 21 Дек 2015 в 08:29