之前做了在一个页面的CRUD的方法,现实中webapi模块往往是单独写服务的,所以修改了一下原来的设计和结构,还是需要很多知识的。
2017.11.15增加patch方法 ,改进服务程序优化写法
2017.11.27增加Promise返回值处理,服务器返回错误信息后的处理.
因为所有的CRUD方法 都写在服务中,所以后台的代码就简单多了,回调还需要详细信息什么的,总之已经能运行正常了:
1 import { Component, OnInit } from '@angular/core' ; 2 import { Patient, PatientService } from './patients.service' ; 3 4 @Component({ 5 selector: 'patient-component' , 6 templateUrl: 'app/app-patient/patient.component.html' , 7 providers: [PatientService] 8 }) 9 export class PatientComponent implements OnInit { 10 results: string[]; 11 myPatientList: Patient[] = []; 12 myPatient: Patient = null ; 13 constructor(private myPatientService: PatientService) 14 { } 15 ngOnInit(): void { 16 this .results = ["ngOnInit()方法" ]; 17 this .getall(); 18 } 19 getall() { 20 this .myPatientService.getall().then(data => this .myPatientList = data); 21 } 22 23 getbyId(id: string) { 24 this .myPatientService.getbyId(id).then(data => this .myPatient = data); 25 } 26 27 httpPostExample(FirstName: string, LastName: string) { 28 this .myPatient = new Patient({ id: '', FirstName: FirstName, LastName: LastName, MiddleName: '', BirthDate: '', EmailAddress: '', ZIPCODE: '', CitizenServiceNumber: '', City: '', Gender: '' }); 29 // 使用then方法等待返回结果,并进一步处理业务需求。then相当入一个回调函数。 30 this .myPatientService.httpPostExample( this .myPatient).then(_ => this .getall()); 31 } 32 httpPutExample(id: string, FirstName: string, LastName: string) { 33 this .myPatient = new Patient({ id: '', FirstName: FirstName, LastName: LastName, MiddleName: '', BirthDate: '', EmailAddress: '', ZIPCODE: '', CitizenServiceNumber: '', City: '', Gender: '', PhoneNumber: '', Street: '' }); 34 this .myPatientService.httpPutExample(id, this .myPatient).then(_ => this .getall()); 35 } 36 37 httpPatchExample(id: string, FirstName: string, LastName: string) { 38 this .myPatient = new Patient({ id: '' , FirstName: FirstName, LastName: LastName }); 39 this .myPatientService.httpPatchExample(id, this .myPatient).then(_ => this .getall()); 40 } 41 42 delbyId(id: string) { 43 this .myPatientService.delbyId(id).then(_ => this .getall()); 44 } 45 }
服务代码
1 import { Injectable } from '@angular/core' ; 2 import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http' ; 3 4 export class Patient { 5 id: string; 6 FirstName: string; 7 LastName: string; 8 MiddleName: string; 9 BirthDate: string; 10 Gender: string; 11 PhoneNumber: string; 12 ZIPCODE: string; 13 City: string; 14 Street: string; 15 EmailAddress: string; 16 CitizenServiceNumber: string; 17 18 public constructor( 19 fields? : { 20 id: string, 21 FirstName? : string, 22 LastName? : string, 23 MiddleName? : string, 24 BirthDate? : string, 25 Gender? : string, 26 PhoneNumber? : string, 27 ZIPCODE? : string, 28 City? : string, 29 Street? : string, 30 EmailAddress? : string, 31 CitizenServiceNumber? : string 32 }) { 33 if (fields) Object.assign( this , fields); 34 } 35 36 getFullName(): string { 37 return this .FirstName + ' ' + this .LastName; 38 } 39 40 41 } 42 @Injectable() 43 export class PatientService { 44 45 myPatientList: Patient[] = []; 46 myPatient: Patient = null ; 47 myWebapiURL = 'http://localhost:52513/api/patients/' ; 48 myHttpHead = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) }; 49 private myHttpParams = new HttpParams().set('username', 'dih').set('password', 'dih' ); 50 constructor(private myhttp: HttpClient) { } 51 52 setPatient(data: any): Patient { 53 return new Patient({ 54 id: data['PatientId' ], 55 FirstName: data['Details' ].FirstName, 56 LastName: data['Details' ].LastName, 57 MiddleName: data['Details' ].MiddleName, 58 BirthDate: data['Details' ].BirthDate, 59 Gender: data['Details' ].Gender, 60 PhoneNumber: data['PersonalInfo' ].PhoneNumberPrimary, 61 ZIPCODE: data['PersonalInfo' ].ZIPCODE, 62 City: data['PersonalInfo' ].City, 63 Street: data['PersonalInfo' ].Street, 64 EmailAddress: data['PersonalInfo' ].EmailAddressPrimary, 65 CitizenServiceNumber: data['PersonalInfo' ].ServiceNumber 66 }); 67 } 68 69 getall(): Promise<Patient[]> { 70 this .myPatientList = []; 71 return this .myhttp.get( this .myWebapiURL).toPromise().then(data => { 72 let count = (<Array<string>> data).length; 73 for ( var i = 0; i < count; i++ ) { 74 this .myPatientList.push( this .setPatient(data[i])); 75 } 76 return this .myPatientList; 77 } 78 ). catch (error => (console.log(error))); 79 } 80 81 getbyId(id: string): Promise<Patient> { 82 return this .myhttp.get( this .myWebapiURL + id).toPromise() 83 .then(data => { 84 this .myPatient = this .setPatient(data); 85 return this .myPatient; 86 }); 87 } 88 setPatientBody(patient: Patient, id: string = '' ): any { 89 return { 90 "PatientId" : id, 91 "Details" : { 92 "FirstName" : patient.FirstName, 93 "LastName" : patient.LastName, 94 "MaidenName": '' , 95 "MiddleName": '' , 96 "CustomId": '' , 97 "BirthDate": "2017-10-18T11:05:51.017" , 98 "Gender": 1 99 }, 100 "Anatomy" : { 101 "BodyWeight": 75 , 102 "BodyHeight": 175 , 103 "LeftFootLength": 0 , 104 "RightFootLength": 0 , 105 "StrideLengthWalking": 0 , 106 "StrideLengthRunning": 0 , 107 "PelvisWidth": 0 , 108 "LeftUpperLegLength": 0 , 109 "RightUpperLegLength": 0 , 110 "LeftLowerLegLength": 0 , 111 "RightLowerLegLength": 0 112 }, 113 "PersonalInfo" : { 114 "ServiceNumber": '' , 115 "EmailAddressPrimary": "abc@a.com" , 116 "EmailAddressSecondary": '' , 117 "PhoneNumberPrimary": '' , 118 "PhoneNumberSecondary": '' , 119 "StreetAddress": '' , 120 "ZIPCode": '' , 121 "City": '' , 122 "Street": '' , 123 "Country": '' , 124 "EmergencyContactDetails": '' 125 }, 126 "AdditionalProperties": '' 127 }; 128 } 129 130 httpPostExample(patient: Patient): Promise<any> { 131 const body = this .setPatientBody(patient); 132 return this .myhttp.post( this .myWebapiURL, body, this .myHttpHead).toPromise(); 133 } 134 135 httpPutExample(id: string, patient: Patient) { 136 const body = this .setPatientBody(patient, id); 137 return this .myhttp.put( this .myWebapiURL + id, body, this .myHttpHead).toPromise(); 138 } 139 140 httpPatchExample(id: string, patient: Patient) { 141 const body = { 142 "PatientId" : id, 143 "Details" : { 144 "FirstName" : patient.FirstName, 145 "LastName" : patient.LastName 146 }, 147 "Anatomy" : { 148 "BodyWeight": 111 , 149 "BodyHeight": 175 150 } 151 }; 152 return this .myhttp.patch( this .myWebapiURL + id, body, this .myHttpHead).toPromise(); 153 } 154 155 delbyId(id: string): Promise< boolean > { 156 return this .myhttp. delete ( this .myWebapiURL + id).toPromise(); 157 } 158 }
增加返回值的处理:【then后有两个参数,一个是正确的返回值,一个是错误的返回值,服务器返回错误的结果后,通过err.error.Message 取得结果,或者直接输出全部err自己点着看.】
this .myPatientService.httpPutExample(id, this .myPatient).then( result => { this .getall(); }, err => { console.error(err.error.Message); this .getall(); } )
服务器返回的错误信息:
客户端接收的错误信息:
html页面没有变化:
< div > patient-component.html </ div > {{results}} < h2 > ngfor </ h2 > < div *ngIf =myPatientList > < ul > < li *ngFor ="let myPatient of myPatientList" > id: < span style ="font-weight:700" > {{myPatient.id}} </ span > FirstName :{{myPatient.FirstName}} </ li > </ ul > </ div > < div > < input type ="text" #txt1 placeholder ="请输入要查询的GUID" > < button (click) ="getbyId(txt1.value)" > 查询 </ button > < button (click) ="delbyId(txt1.value)" > 删除 </ button > < div *ngIf =myPatient > < ul > < li > id:{{myPatient.id}} </ li > < li > FirstName :{{myPatient.FirstName}} </ li > < li > email:{{myPatient.EmailAddress}} </ li > </ ul > </ div > </ div > < div > FirstName : < input type ="text" #txtFirstName placeholder ="请输入FirstName" > LastName : < input type ="text" #txtLastName placeholder ="请输入LastName" > < button (click) ="httpPostExample(txtFirstName.value,txtLastName.value)" > httpPostExample【新增】 </ button > < button (click) ="httpPutExample(txt1.value,txtFirstName.value,txtLastName.value)" > httpPutExample【修改】 </ button >
<button (click)="httpPatchExample(txt1.value,txtFirstName.value,txtLastName.value)"> httpPatchExample【修改】</button>
</ div >
前台效果
查看更多关于angular HttpClient post put patch del 方法(2)-Promis的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did222668