RestEasy - JSON 响应 - 从 Angular2 客户端,如何只获取 JSON 对象
RestEasy - JSON response - From Angular2 client, how to only get JSON Object
我是 REST 服务的新手,我有一个调用 RestEasy JAX-RS 服务的 Angular2 客户端。我想要得到的只是 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
您要返回的是来自 Http
请求的 Response
对象。这是所有 Http
操作都会 return 的结果。从中解析 JSON 的最简单方法是调用 json()
方法
this.service.getHello()
.then((res: Response) => {
let obj = res.json();
});
如果您希望 getHello
只是 return 对象而不必解析它(在调用客户端上),那么您可以在 getHello
方法中通过映射来完成它(使用 Observable.map
操作)
getHello() {
this.http.get(..)
.map((res: Response) => res.json())
.toPromise();
}
正如 peeskillet 上面所说,您正在从请求中取回整个响应,虽然有时您可能想要检查 headers,也许是为了处理不同的 return 条件(重试或在 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() 和 return 一个 Observable object,我们使用 .map 将响应解析为 JSON ,它也是 return 一个我们订阅的 Observable。
订阅有3个回调函数,
.subscribe(成功, 失败, 完成)
在上面的示例中,成功,我们将有效负载-数据-分配给this.data,如果订阅失败,你记录错误,当它 完成 时,我们可以做任何我们想做的事,但在这种情况下,我们将 this.data 记录到控制台 - 这是可选的,但我注销了开发时的结果,然后将它们剥离出来。
我是 REST 服务的新手,我有一个调用 RestEasy JAX-RS 服务的 Angular2 客户端。我想要得到的只是 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
您要返回的是来自 Http
请求的 Response
对象。这是所有 Http
操作都会 return 的结果。从中解析 JSON 的最简单方法是调用 json()
方法
this.service.getHello()
.then((res: Response) => {
let obj = res.json();
});
如果您希望 getHello
只是 return 对象而不必解析它(在调用客户端上),那么您可以在 getHello
方法中通过映射来完成它(使用 Observable.map
操作)
getHello() {
this.http.get(..)
.map((res: Response) => res.json())
.toPromise();
}
正如 peeskillet 上面所说,您正在从请求中取回整个响应,虽然有时您可能想要检查 headers,也许是为了处理不同的 return 条件(重试或在 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() 和 return 一个 Observable object,我们使用 .map 将响应解析为 JSON ,它也是 return 一个我们订阅的 Observable。
订阅有3个回调函数, .subscribe(成功, 失败, 完成)
在上面的示例中,成功,我们将有效负载-数据-分配给this.data,如果订阅失败,你记录错误,当它 完成 时,我们可以做任何我们想做的事,但在这种情况下,我们将 this.data 记录到控制台 - 这是可选的,但我注销了开发时的结果,然后将它们剥离出来。