Получить Seq сущностей из ответа akka http на основе массива json

Я думаю, что вы неправильно возвращаете ответ json. Это должно быть так:

var self = this;
fetch('https://randomuser.me/api/?results=50', {
 responseType: 'json',
})
.then((response) => response.json())
.then((json) => {
    console.log(json.data)
    self.setState({pictures : json.data },()=>{
       console.log(self.state.pictures)
    })
});
1
задан Andronicus 20 January 2019 в 16:23
поделиться

2 ответа

  1. type является ключевым словом (псевдоним типа) и не должно использоваться в качестве имени переменной
  2. Вам необходимо вызвать метод onComplete() для Future ожидания результата. Для этого мы можем определить заполнитель в getFoos() - var fs: Seq[Foo] = Nil. В будущее мы добавляем onComplete(tfr => fs = tfr.get.foos), а затем ждем некоторое время: Await.result(f, Duration(5000, "millis")) (до 5 с в этом примере). Наконец, мы можем вернуть то, что находится в нашем заполнителе.

Это должно сделать работу:

def getFoos(): Seq[Foo] = {
  var fs: Seq[Foo] = Nil
  val req = HttpRequest(method = HttpMethods.GET)
  .withUri(Uri("/api/foo")).withHeaders(headers.Accept(MediaRange(MediaTypes.`application/json`)))

  val f = Source
   .single(req)
   .via(flow)
   .map(response => Unmarshal(response.entity).to[FooResponse])
  f.onComplete(tfr => fs = tfr.get.foos)
  Await.result(f, Duration(5000, "millis"))
  fs
}
0
ответ дан Andronicus 20 January 2019 в 16:23
поделиться

Я рекомендую изменить тип возвращаемого значения getFoos с Seq[Foo] на Future[Seq[Foo]], чтобы оставаться в контексте Future:

def getFoos(): Future[Seq[Foo]] = {
  val req =
    HttpRequest(method = HttpMethods.GET)
      .withUri(Uri("/api/foo"))
      .withHeaders(headers.Accept(MediaRange(MediaTypes.`application/json`)))

  Source
    .single(req)
    .via(flow)
    .map(response => Unmarshal(response.entity).to[FooResponse])
    .mapAsync(parallelism = 1)(fooResponse => fooResponse.map(_.foos))
    .runWith(Sink.head)
}

Также, поскольку type является зарезервированным ключевым словом в Scala, его нужно заключить в обратные кавычки в классе case Foo:

case class Foo(id: String, `type`: String, color: String)
0
ответ дан Jeffrey Chung 20 January 2019 в 16:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: