我的Angular服务中有一个方法,它将一系列字符串组合到一个用于获取Google的Youtube Data API v3请求的网址。
当我最终组合字符串时,它的一部分被省略(参见下面日志中的......)。
记录每个值,以及结合经典级联和字符串插值时的结果。两者都省略了我的一部分字符串,违反了我的请求。
为什么会这样?我该如何防止这种情况?
LOG
Parts
https://www.googleapis.com/youtube/v3/ search AIzjSyCA_g_zkSTs43Py7yjZtOAcXWvkwQTdU snippet zelda 3 items(id,snippet(title,description))
Concat Combined
https://www.googleapis.com/youtube/v3/search?key=AIzjSyCA_g_zkSTs43Py7yjZtO…art=snippet?q=zelda?maxResults=3?fields=items(id,snippet(title,description))
Interpolation Combined
https://www.googleapis.com/youtube/v3/search?key=AIzjSyCA_g_zkSTs43Py7yjZtO…art=snippet&q=zelda&maxResults=3&fields=items(id,snippet(title,description))
方式
public searchByKeyword(): Observable<any> {
const base = 'https://www.googleapis.com/youtube/v3/';
const endpoint = 'search';
const apiKey = 'AIzjSyCA_g_zkSTs43Py7yjZtOAcXWvkwQTdU';
const part = 'snippet';
const query = 'zelda';
const maxResults = '3';
const fields = 'items(id,snippet(title,description))';
console.log('Parts');
console.log(base, endpoint, apiKey, part, query, maxResults, fields);
const concatCombined = base + endpoint + '?key=' + apiKey + '?part=' + part + '?q=' + query + '?maxResults=' + maxResults + '?fields=' + fields;
console.log('Concat Combined');
console.log(concatCombined);
const interpolationCombined = `${base}${endpoint}?key=${apiKey}?part=${part}&q=${query}&maxResults=${maxResults}&fields=${fields}`;
console.log('Interpolation Combined');
console.log(interpolationCombined);
return this.http.get(interpolationCombined, this.getHeaderOption()).map(x => x.json());
}
请注意,出于安全原因,修改了API密钥。它不起作用。
似乎错误与浏览器有关。 Edge不会缩短我的网址,但却无法读取我的字段部分的最后两个。)。
我想这会将问题改为我如何编码/组合我的网址,以便浏览器可以实际组合它并理解整个部分。
答案 0 :(得分:2)
您在查询网址中使用了太多问号(&#34;?&#34;)。您只需要第一个来定义查询参数,然后使用&符标记(&#34;&amp;&#34;)来限制每个参数。
const concatCombined = base + endpoint + '?key=' + apiKey + '&part=' + part + '&q=' + query + '&maxResults=' + maxResults + '&fields=' + fields;
const interpolationCombined = `${base}${endpoint}?key=${apiKey}&part=${part}&q=${query}&maxResults=${maxResults}&fields=${fields}`;