首页 文章

RestEasy - JSON响应 - 来自Angular2客户端,如何只获取JSON对象

提问于
浏览
0

我是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中运行

2 回答

  • 2

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

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

    如果你希望 getHello 只返回对象而不必解析它(在调用客户端上),那么你可以通过映射它来使用 getHello 方法在 getHello 方法中完成它(使用 Observable.map 操作)

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

    正如peeskillet上面所说,你从请求中获取了整个响应,有时你可能想要检查 Headers ,可能是为了处理不同的返回条件(例如,重试或重定向4xx或5xx响应),大多数我们假设成功请求的时间,我们只想要有效载荷 .

    Angular2鼓励使用Observable,因此您的服务可能如下所示:

    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( successfailurecomplete

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

相关问题