使用来自 Flickr JSONP 的 JSON 数据 api
Getting JSON data using JSONP from Flickr api
我遇到了一个新问题 - Jsonp。我已经阅读并观看了视频,但无法找到解决问题的方法。
首先,我正在使用 Angular 6。我试图从使用 JSONP 的 api 获得 json 响应,但是当我尝试在我的应用程序中使用它时应用程序出现 CORS 错误。所以我想修复它而不必安装 chrome 的 CORS 插件。浏览器上的响应是这样的:
jsonFlickrFeed({
"title": "Uploads from everyone",
"link": "https:\/\/www.flickr.com\/photos\/",
"description": "",
"modified": "2018-10-13T21:16:50Z",
"generator": "https:\/\/www.flickr.com",
"items": [{
"title": "photo 2504 was taken at 14:18:38",
"link": "https:\/\/www.flickr.com\/photos\/barrycorneliusox\/30359327537\/",
"media": {
"m": "https:\/\/farm2.staticflickr.com\/1944\/30359327537_fac974807d_m.jpg"
},
"date_taken": "2018-10-13T14:18:38-08:00",
"description": " <p><a href=\"https:\/\/www.flickr.com\/people\/barrycorneliusox\/\">barrycorneliusox<\/a> posted a photo:<\/p> <p><a href=\"https:\/\/www.flickr.com\/photos\/barrycorneliusox\/30359327537\/\" title=\"photo 2504 was taken at 14:18:38\"><img src=\"https:\/\/farm2.staticflickr.com\/1944\/30359327537_fac974807d_m.jpg\" width=\"240\" height=\"160\" alt=\"photo 2504 was taken at 14:18:38\" \/><\/a><\/p> <p><a href=\"http:\/\/www.oxonraces.com\/photos\/2018-10-13-oxford\/\" rel=\"nofollow\">Click here for more photos of the 2018 Chiltern XC League Match 1 - Oxford<\/a>. If you put a photo somewhere public, please add the credit <em>Photo by Barry Cornelius<\/em>.<\/p>",
"published": "2018-10-13T21:16:50Z",
"author": "nobody@flickr.com (\"barrycorneliusox\")",
"author_id": "159968055@N03",
"tags": "2018 chilternxcleaguematch1oxford oxford jsvmenpointjfirstlap barrycornelius oxonraces"
},
.....,
]
})
我的服务:(使用 jsonp)
getImages() {
return this.jsonp.request(this.imagesUrl).subscribe(res => {
console.log(res);
})
}
不起作用。我做错了什么?
我的 api URL :
https://api.flickr.com/services/feeds/photos_public.gne?format=json
由于您使用的是 Angular 6,
您必须导入 HttpClientModule, HttpClientJsonpModule
并将它们添加到您要进行此调用的模块的 imports
数组中:
...
import { HttpClientModule, HttpClientJsonpModule } from '@angular/common/http';
...
@NgModule({
imports: [..., HttpClientJsonpModule, HttpClientModule, ...],
...
})
export class AppModule { }
然后在您的服务中,在 API URL 中,您还必须指定 jsoncallback=JSONP_CALLBACK
而不是 nojsoncallback=callback
:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class PhotoService {
imagesUrl = `https://api.flickr.com/services/feeds/photos_public.gne?format=json&jsoncallback=JSONP_CALLBACK`;
constructor(private http: HttpClient) { }
getImages() {
return this.http.jsonp(this.imagesUrl, 'JSONP_CALLBACK');
}
}
然后在您的组件中:
...
import { PhotoService } from './photo.service';
...
export class PhotosComponent {
myArray: any[];
constructor(private photoService: PhotoService) {
}
ngOnInit() {
this.photoService.getImages()
.subscribe((res: any) => this.myArray = res.items);
}
}
这里有一个 Sample StackBlitz 供您参考。
PS: 你也在 subscribe
里面 getImages
这会 return 一个 Subscription
而不是 Observable
我遇到了一个新问题 - Jsonp。我已经阅读并观看了视频,但无法找到解决问题的方法。
首先,我正在使用 Angular 6。我试图从使用 JSONP 的 api 获得 json 响应,但是当我尝试在我的应用程序中使用它时应用程序出现 CORS 错误。所以我想修复它而不必安装 chrome 的 CORS 插件。浏览器上的响应是这样的:
jsonFlickrFeed({
"title": "Uploads from everyone",
"link": "https:\/\/www.flickr.com\/photos\/",
"description": "",
"modified": "2018-10-13T21:16:50Z",
"generator": "https:\/\/www.flickr.com",
"items": [{
"title": "photo 2504 was taken at 14:18:38",
"link": "https:\/\/www.flickr.com\/photos\/barrycorneliusox\/30359327537\/",
"media": {
"m": "https:\/\/farm2.staticflickr.com\/1944\/30359327537_fac974807d_m.jpg"
},
"date_taken": "2018-10-13T14:18:38-08:00",
"description": " <p><a href=\"https:\/\/www.flickr.com\/people\/barrycorneliusox\/\">barrycorneliusox<\/a> posted a photo:<\/p> <p><a href=\"https:\/\/www.flickr.com\/photos\/barrycorneliusox\/30359327537\/\" title=\"photo 2504 was taken at 14:18:38\"><img src=\"https:\/\/farm2.staticflickr.com\/1944\/30359327537_fac974807d_m.jpg\" width=\"240\" height=\"160\" alt=\"photo 2504 was taken at 14:18:38\" \/><\/a><\/p> <p><a href=\"http:\/\/www.oxonraces.com\/photos\/2018-10-13-oxford\/\" rel=\"nofollow\">Click here for more photos of the 2018 Chiltern XC League Match 1 - Oxford<\/a>. If you put a photo somewhere public, please add the credit <em>Photo by Barry Cornelius<\/em>.<\/p>",
"published": "2018-10-13T21:16:50Z",
"author": "nobody@flickr.com (\"barrycorneliusox\")",
"author_id": "159968055@N03",
"tags": "2018 chilternxcleaguematch1oxford oxford jsvmenpointjfirstlap barrycornelius oxonraces"
},
.....,
]
})
我的服务:(使用 jsonp)
getImages() {
return this.jsonp.request(this.imagesUrl).subscribe(res => {
console.log(res);
})
}
不起作用。我做错了什么?
我的 api URL :
https://api.flickr.com/services/feeds/photos_public.gne?format=json
由于您使用的是 Angular 6,
您必须导入 HttpClientModule, HttpClientJsonpModule
并将它们添加到您要进行此调用的模块的 imports
数组中:
...
import { HttpClientModule, HttpClientJsonpModule } from '@angular/common/http';
...
@NgModule({
imports: [..., HttpClientJsonpModule, HttpClientModule, ...],
...
})
export class AppModule { }
然后在您的服务中,在 API URL 中,您还必须指定 jsoncallback=JSONP_CALLBACK
而不是 nojsoncallback=callback
:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class PhotoService {
imagesUrl = `https://api.flickr.com/services/feeds/photos_public.gne?format=json&jsoncallback=JSONP_CALLBACK`;
constructor(private http: HttpClient) { }
getImages() {
return this.http.jsonp(this.imagesUrl, 'JSONP_CALLBACK');
}
}
然后在您的组件中:
...
import { PhotoService } from './photo.service';
...
export class PhotosComponent {
myArray: any[];
constructor(private photoService: PhotoService) {
}
ngOnInit() {
this.photoService.getImages()
.subscribe((res: any) => this.myArray = res.items);
}
}
这里有一个 Sample StackBlitz 供您参考。
PS: 你也在 subscribe
里面 getImages
这会 return 一个 Subscription
而不是 Observable