Я пытаюсь создать 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 => вкладка сети, я нахожу:
Однако я не получаю исключения, потому что каким-то образом URL-адрес фиксируется и отправляет новый запрос с действительным URL-адресом:
Проблема в разнице между ?count=5&page=1
и ?&count=5&page=1
Это приводит к застреванию счетчика и никогда не заканчивается.
В: какие улучшения можно внести в код, чтобы получить действительный URL-адрес?
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());
}
Есть и другие способы достичь того, чего вы пытаетесь достичь, но это один из способов сделать это.
Пытаться :
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}`;
Это обходной путь, я верю.
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("&");
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.