angular2下用http到由SpringMVC釋出rest服務的伺服器端拉取資料
阿新 • • 發佈:2019-02-20
本文講述如何使用angular2的http服務來去一臺由SpringMVC釋出的rest服務的伺服器上拉取資料。
我們現來上服務端程式碼,
@ResponseBody @RequestMapping("/hero") public Object getData(HttpServletResponse response) { //伺服器端跨域的配置 response.setHeader("Access-Control-Allow-Origin","*"); logger.warn("得到呼叫....."); System.out.println(new Hero().getName() ); Hero hero = new Hero(); hero.setName("張三李強"); return hero; }
response.setHeader("Access-Controller-Allow-Origin","*");這行程式碼是為了允許跨域, 所謂的跨域這裡筆者簡單的講一下,就是訪問不同域的時候,是否允許跨域的一個問題。
javascript請求的網路地址只要協議、域名、埠有任何一個不同,都被當作是不同的域。
打一個比方 http://www.test.com/ 和
http://www.test.com:8080就是不同的域
伺服器端的rest服務就講到這裡。
現在來講客戶端的實現。
angular2採用的程式語言是typescript。
類似於其他的MVVM框架。angular2同樣的進行了元件化。
這裡筆者寫了三個檔案
student.component.ts //元件檔案
student,service.ts //服務檔案
student.ts //實體檔案
元件程式碼呼叫服務程式碼,服務的程式碼發起http請求從rest伺服器上拉取資料
這裡筆者直接上程式碼了,程式碼的註釋都已經很詳細了。足以說明問題
student.component.ts
import {Component, OnInit} from "@angular/core"; import {StudentService} from "./student.service"; import {Student} from "./student"; @Component({ moduleId: module.id, selector: 'student', template: `{{title}}`, providers: [StudentService], }) //實現了OnInit介面以便於載入完元件就進行從伺服器端抓取資料 export class StudentComponent implements OnInit { title = '這是學生元件用於演示ng2從springmvc伺服器端拉取資料'; students: Student[]; //注入StudentService服務 constructor(private studentService: StudentService) { } //元件被載入立即去rest伺服器上拉取資料 ngOnInit(): void { this.getStudent(); } getStudent() { this.studentService.getStudent().then(students => console.log() , error => console.log(error)); } }
student,service.ts
import {Injectable} from "@angular/core";
import {Http, Response} from "@angular/http";
import {Student} from "./student";
@Injectable()
export class StudentService {
//從指定的地址拉取資料
private url = 'http://localhost:8080/hero';
constructor(private http: Http) {
}
getStudent(): Promise<Student[]> {
return this.http.get(this.url).toPromise()
.then(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
//將拿到的hero資料進行列印....
console.log("即將開始對Student資料的列印-----");
console.log(body['name']);
console.log("結束對Student資料的列印-----");
return body;
}
private handleError (error: Response | any) {
console.log("有錯誤???");
// In a real world app, we might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Promise.reject(errMsg);
}
}
student.ts
//自己封裝的實體
export class Student {
constructor(public id: number, public name: string) {
}
}
完整的程式碼地址是: http://download.csdn.net/detail/u013803262/9752256
程式碼在myNg2_http_demo這個分支上,程式碼在app/student資料夾下。
至於伺服器端只需要在springMVC的controller類中加入一個被@RequestMapping註解修改的方法即可,直接返回pojo物件就可以了。