为什么我的字符串的一部分被省略了?

时间:2017-06-13 14:49:29

标签: javascript string angular

我的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不会缩短我的网址,但却无法读取我的字段部分的最后两个。)。

我想这会将问题改为我如何编码/组合我的网址,以便浏览器可以实际组合它并理解整个部分。

1 个答案:

答案 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}`;