【发布时间】:2020-11-03 14:55:01
【问题描述】:
我正在尝试学习如何使用 jsonapi 从 Drupal 8 获取内容到我的 Angular 7 应用程序中,从 Preston So 的 book,Decoupled Drupal in Practice 开始。它没有展示如何从关系中获取资源并包含在内。
jsonapi 规范提供了一个包含函数,我可以在其中从节点获取相关资源,而无需进行单独的调用。
使用http://localhost/jsonapi/node/article/MYUUID?include=field_image 会以这种通用格式呈现一个不错的 json 对象。
jsonapi
data
--attributes
--relationships
included
我正在尝试获取包含的部分,但我的 ArticleService 仅获取数据的内容,我也想获取包含的部分。
我的文章.ts
export class Article {
attributes: object;
relationships: object;
included: object;
}
我的文章.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError, map, mergeMap } from 'rxjs/operators';
import { Article } from '../articles/article';
import { Image } from '../articles/image';
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json'})
}
@Injectable({
providedIn: 'root'
})
export class ArticleService {
private articlesUrl = 'http://localhost/jsonapi/node/article';
constructor(private http: HttpClient) {}
getArticle(id: string): Observable<Article>
{
if (id) {
return this.http.get<Article>(this.articlesUrl + '/' + id + '?include=field_image', httpOptions)
.pipe(
map(res => res['data'])
)
.pipe(
catchError(this.handleError([]))
);
}
}
private handleError<T> (result?: T) {
return (error: any): Observable<T> => {
console.error(error);
return of(result as T);
}
}
}
所以我的第一个映射函数是从正文中检索数据对象。我应该可以放大它。我尝试设置
map(res => res['body']),然后是 map(res => res['']),它不返回任何对象。阅读 rxjs/operators 我看到一些操作符,如 mergeMap、concatMap 失败,因为我不了解如何获取整个响应正文的内容。我的搜索结果似乎没什么帮助,因此我正在寻找有关如何获取整个响应正文的指针。
【问题讨论】:
-
从组件订阅 getArticle() 服务。 Observable 在您订阅之前不会被调用。
-
您没有在 Angular 应用程序中使用客户端 JSON:API 库而是尝试手动解析响应的任何原因?
-
在我的搜索中,我发现了一些与 Angular 2 相关的内容。它们可能会有所帮助,但我已经学会了在调试和研究答案时不要增加复杂性。因此,我对可用工具的无知会有所帮助,而您的评论会有所帮助。 @jelhan
-
我认为如果你将 JSON:API 与客户端库结合起来,它大部分是值得的。 JSON:API 有效负载模式的设计目的不是易于解析。特别是链接资源需要一些代码。我不建议一遍又一遍地重新实现该逻辑。更不用说客户端缓存、链接和通过关系导航、允许通过链接重新加载、更新和删除关系等高级功能。
-
你会推荐哪个?还是为 Angular 2 编写的一个通常就足够了,等待调整?
标签: angular rxjs drupal-8 json-api