【问题标题】:RestEasy - JSON response - From Angular2 client, how to only get JSON ObjectRestEasy - JSON 响应 - 从 Angular2 客户端,如何只获取 JSON 对象
【发布时间】:2017-03-14 01:16:49
【问题描述】:

我是 REST 服务的新手,我有一个 Angular2 客户端调用 RestEasy JAX-RS 服务。我想要得到的只是 JSON 格式的“Hello World”消息。我只期待一个 JSON 对象,但我得到了以下结构的响应:

_body: "{"message":"Hello World!!"}"
 headers: t
 ok: true
 status: 200
 statusText: "OK"
 type: 2
 url: "http://localhost:8080/helloapp/rest/hello/world"
 __proto__: ...

我的问题是,应该这样吗?

我的意思是,我认为我可以直接从响应中访问 JSON 对象。类似的东西

this.service.getHello()
.then( result => {
  console.log(JSON.parse(result)); //{message: "Hello World"}
  this.message = JSON.parse(result).message;
});

但我实际上必须从 _body 获得它:

   this.service.getHello()
    .then( result => {
      this.message = JSON.parse(result._body).message;
      console.log(this.message);//Hello World
    });

这是一个 RestEasy 配置的东西,有没有办法改变它?

或者

我是否应该考虑在我的数据响应中始终有一个字段_body,这是默认的响应结构?

为了最终考虑,这是我的后端代码:

HelloWorld 服务:

@Path("/hello")
@Produces({ "application/json" })
@Consumes({ "application/json" })
public class HelloWorld {

    public HelloWorld() {}

    @GET
    @Path("/world")
    public Message getHello(){
        return new Message("Hello World!!");    
    }
}

我的 RestEasy 版本是 3.1.1.Final 在 Wildfly 10.1.0.Final 中运行

【问题讨论】:

    标签: json angular jax-rs resteasy


    【解决方案1】:

    您得到的是来自Http 请求的Response 对象。这是所有Http 操作将返回的内容。从中解析 JSON 的最简单方法是在其上调用 json() 方法

    this.service.getHello()
        .then((res: Response) => {
          let obj = res.json();
        });
    

    如果您希望getHello 只返回对象而无需解析它(在调用客户端上),那么您可以通过映射它在getHello 方法中执行它(使用Observable.map 操作)

    getHello() {
      this.http.get(..)
        .map((res: Response) => res.json())
        .toPromise();
    }
    

    【讨论】:

    • 谢谢,我只是无法意识到,当我使用 Angular HTTPModule 时,它​​实际上是在创建响应对象。我也在我的服务类'rxjs/Rx'中使用;库并将其转换为 Promise 而不是 Observable,如下所示:return this.http.get( this.baseURL + 'hello/world').toPromise(); 只是因为我就是这样学习它的。但是使用 Observables 是正确的方法吗?
    • 我不知道“正确”的方式。这可能只是一种偏好。但是你肯定会在变成 Promise 之前使用 Observable 操作符(这就是你的选择)
    【解决方案2】:

    正如 peeskillet 上面所说,您从请求中获取了整个响应,虽然有时您可能想要检查标头,也许是为了处理不同的返回条件(例如重试或重定向 4xx 或 5xx 响应) ,大多数时候我们假设一个成功的请求,我们只想要有效负载。

    Angular2 鼓励使用 Observables,所以你的服务可能看起来像这样:

    getHello() 
    {
    return this.http.get(http://localhost:8080/helloapp/rest/hello/world)
    }
    

    您的组件可能看起来像这样:

    data: string;
    
    ngOnInit() {
     this.service
         .getHello()
         .map(response => response.json())
         .subscribe (
              data => {
                    this.data = data, 
              },
              err => console.log('Error',err),
              () => console.log('data',this.data) 
         );
    }
    

    您调用服务,它是一个 http.get() 并返回一个 Observable 对象,我们使用 .map 将响应解析为 JSON,它也返回一个我们订阅的 Observable。

    订阅有三个回调函数, .subscribe(成功, 失败, 完成)

    在上面关于 success 的示例中,我们将有效负载 - 数据 - 分配给 this.data,如果订阅 失败,您记录错误,当它 完成,我们可以做任何我们喜欢的事情,但在这种情况下,我们将 this.data 记录到控制台 - 这是可选的,但我在开发时会注销结果,然后再将它们删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2019-09-25
      • 2016-09-12
      相关资源
      最近更新 更多