Получение данных JSON с использованием JSONP из API-интерфейса Flickr - PullRequest
0 голосов
/ 14 октября 2018

Я столкнулся с новой проблемой - Jsonp.Я читал и смотрел видео, но не смог найти решение, чтобы решить мою проблему.

Сначала я использую Angular 6. Я пытаюсь получить ответ json от API, использующего JSONP, но когда я пытаюсь использовать его в своем приложении, я получил ошибку CORS.Поэтому я хочу исправить это, не устанавливая хромовый плагин 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);
  })
}

не работает.что я делаю не так?

URL моего API:

https://api.flickr.com/services/feeds/photos_public.gne?format=json

1 Ответ

0 голосов
/ 14 октября 2018

Поскольку вы используете Angular 6,

Вам придется импортировать HttpClientModule, HttpClientJsonpModule и добавить их в массив imports вашего модуля, в который вы хотите сделать этот вызов:

...
import { HttpClientModule, HttpClientJsonpModule } from '@angular/common/http';
...

@NgModule({
  imports: [..., HttpClientJsonpModule, HttpClientModule, ...],
  ...
})
export class AppModule { }

Затем в вашем сервисе в URL-адресе API вам также потребуется указать 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);
  }

}

Вот Образец StackBlitz для вашего реф.

PS: Вы также subscribe внутри getImages, который будет возвращать Subscription вместо Observable

...