Angular 为嵌套JSON数据创建角度模型

Angular 为嵌套JSON数据创建角度模型,angular,typescript,model,Angular,Typescript,Model,我需要使用httpclient创建一个简单的crud 如何正确获取此嵌套json的请求数据 JSON 服务 模型 组件技术 我尝试了这种方法,但我的请求返回了一个未定义的对象。您的结果可能不是json主体,而是整个响应对象,因此它不包含资源属性。要从响应中检索正文,需要调用json方法: 您的API看起来很奇怪,但可能只是一个解释问题。它作为一种响应是有意义的,其中错误和消息在有效负载中,而不是post,如果是这样的话,@krystianpe给出的答案是正确的,我必须补充一点,如果使用新的Htt

我需要使用httpclient创建一个简单的crud

如何正确获取此嵌套json的请求数据

JSON

服务

模型

组件技术

我尝试了这种方法,但我的请求返回了一个未定义的对象。

您的结果可能不是json主体,而是整个响应对象,因此它不包含资源属性。要从响应中检索正文,需要调用json方法:


您的API看起来很奇怪,但可能只是一个解释问题。它作为一种响应是有意义的,其中错误和消息在有效负载中,而不是post,如果是这样的话,@krystianpe给出的答案是正确的,我必须补充一点,如果使用新的HttpClient,那么json映射将自动完成,前提是angular能够确定这是一个json响应类型:来自服务器的application/json头或类似类型

无论如何,我将以一种我认为更好的惯用REST API的方式快速解释:

创建新计划

职位: 正文:{ 日期:2018-03-28:11:30:00, 观察:创建一个新的时间表, 地点:卡车车库 }

返回所有活动计划

获取:

如果需要过滤器,您有两个选项:

最简单的方法是传递参数:例如。使用参数 为从未见过的更复杂或更抽象的东西创建请求头。使用HttpHeaders 编辑计划:

PUT:/api/schedule/1

正文:{ 日期:2018-03-28:11:30:00, 观察:新的观察, 地点:新地点 }

您有两个选择: 1.传递整个对象并更新所有属性 2.仅传递正在更改的属性

删除操作非常简单

删除:/api/1

如果您需要确定哪辆卡车有时间表,请将时间表放在有效负载车身上:{ 日期:2018-03-28:11:30:00, 观察:新的观察, 地点:新地点, 卡车识别号:1 }

开始/停止一个计划,这是你的主要问题,我认为,你有更多的灵活性。以下是一些方法:

PUT:/api/schedule/1/start PUT:/api/计划/1/停止

PUT:/api/schedule/1/actions 正文:{state:start,when:now}

PUT表示您正在以某种方式更新系统的状态。但这看起来像是您与开始对象或操作对象有关系,并且正在改变这一点。所以我更喜欢:

PUT/POST/GET:/api/schedule/1/actions/start

使用PUT表示动作是幂等的,这是一个混淆词,它只改变时间表,没有其他副作用。我认为是这样的。 使用POST指示一个不是幂等的动作,其副作用未知或影响他人。 使用GET调用仅准备就绪且在系统中没有副作用的操作,例如发送电子邮件

您可以也应该在主体中传递参数。在本例中,您正在配置开始参数,但从GET开始没有意义,请使用urlparms

这将在中进行更详细的解释


stackoverflow中有一个讨论:

在服务使用映射中更改响应

get(id: number){
    return this.http.get(environment.apiUrl + id + "/stopschedule")
    .map(response=>response.resource); //NOT return response, just response.resource
    .catch(this.errorHandler);
}
如果您使用的是HttpClient API,我建议您将模型更改为以下内容:

class ServerResponse<T> {
  resource: T;
  errors: string;
  message: string;
}

class Travel {
  date: Date;
  place: string;
  observation: string;
}
export class Travel {
    date: Date;
    place: string;
    observation: string;
}


export class ResponseDetails { 
    errors:string;
    message : string; 
}

import { Travel} from './travel';
export class Response extends ResponseDetails{
    travel : Travel; 
}
//Get data
this.getData = this.travelService.get(this.id)
    .subscribe(result => this.data = result['resource'], result =>  this.erro = true);
this.getData = this.travelService.get(this.id)
  .map(response => response.json())
  .subscribe(result => this.data = result['resource'], result =>  this.erro = true);
get(id: number){
    return this.http.get(environment.apiUrl + id + "/stopschedule")
    .map(response=>response.resource); //NOT return response, just response.resource
    .catch(this.errorHandler);
}
class ServerResponse<T> {
  resource: T;
  errors: string;
  message: string;
}

class Travel {
  date: Date;
  place: string;
  observation: string;
}
get(id: number): Observable<ServerResponse<Travel>>{
    return this.http.get<ServerResponse<Travel>>(`${environment.apiUrl}${id}/stopschedule`);
}
this.getData = this.travelService.get(this.id)
    .subscribe(
      result => this.data = result.resource,
      () =>  this.erro = true
    );