У меня возникают некоторые проблемы, когда я пытаюсь вызвать конечную точку CouchDB, которая возвращает документ с вложениями на Angular. По умолчанию для получения какого-либо документа в CouchDB конечной точкой является host / database / docId, который возвращает документ без вложений. Для включения вложений в ответ необходимо передать в качестве параметров запроса attachments = true. Поэтому, когда я вызываю конечную точку host / database / docId, например, attachments = true в Postman, возвращает что-то вроде этого:
--27e6cca24322032bfdcf675f79cc0fb8
Content-Type: application/json
{"_id":"f4f1e09fa87677d0562ce9a5f300c5a4","_rev":"4-26cee6e26c8dd9ca809a6ab4e477ec48","descript":"testing attachments...","title":"test","_attachments":{"test.txt":{"content_type":"text/plain","revpos":4,"digest":"md5-t6aOnQrBAqiiZKaygsDknQ==","length":4,"follows":true,"encoding":"gzip","encoded_length":24}}}
--27e6cca24322032bfdcf675f79cc0fb8
Content-Disposition: attachment; filename="test.txt"
Content-Type: text/plain
Content-Length: 24
Content-Encoding: gzip
�
Ответ приходит так, потому что вложения включены в двоичном видеили блоб данных. Но для включения данных документа, как base64, в основном я добавляю параметр заголовка Accept с пустым значением, как будто я ожидаю что-либо получить. С заголовком Accept, почтальон правильно вернет json:
{
"_id": "f4f1e09fa87677d0562ce9a5f300c5a4",
"_rev": "4-26cee6e26c8dd9ca809a6ab4e477ec48",
"descript": "testing attachments...",
"title": "test",
"_attachments": {
"test.txt": {
"content_type": "text/plain",
"revpos": 4,
"digest": "md5-t6aOnQrBAqiiZKaygsDknQ==",
"data": "dGVzdA=="
}
}
}
Но на Angular это плохо работает. Когда я пытаюсь вызвать конечную точку с помощью Accept Header в первый раз, httpClient возвращает мне сообщение об ошибке «Ошибка Http во время анализа для host / database / docId? Attachments = true». Но, когда я звоню второй раз, он работает нормально. Я что-то не так делаю?
public async getDoc(database: string, id: string): Promise<any> {
const headers: HttpHeaders = new HttpHeaders().append("Content-Type", "application/json").append("Accept", "");
const params: HttpParams = new HttpParams().set("attachments", "true");
return await new Promise<any>(async(resolve, reject) => {
// If I uncomment this, the second call will works normally, but this call will fail.
// await this.http
// .get(this.url + "/" + database + "/" + id, { headers, params, withCredentials: true })
// .subscribe(resp => console.log(resp), err => console.log(err));
await this.http
.get(this.url + "/" + database + "/" + id, { headers, params, withCredentials: true })
.toPromise()
.then(resp => resolve(resp))
.catch(err => reject(err));
});
}