我是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中运行
答案 0 :(得分:2)
您回复的内容是Http
请求中的Response
对象。这就是所有Http
操作将返回的内容。解析JSON的最简单方法是在其上调用json()
方法
this.service.getHello()
.then((res: Response) => {
let obj = res.json();
});
如果您希望getHello
只返回对象而不必解析它(在调用客户端上),那么您可以通过映射getHello
方法在Observable.map
方法中执行它(使用{{ 1}}操作)
getHello() {
this.http.get(..)
.map((res: Response) => res.json())
.toPromise();
}
答案 1 :(得分:1)
正如peeskillet上面所说,你从请求中获取了整个响应,有时你可能想要检查标题,或许是为了处理不同的返回条件(例如,重试或重定向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(成功,失败,完成)
在成功上面的示例中,我们将有效负载 - 数据 - 分配给this.data,如果订阅失败,则记录错误,当 >完成,我们可以做任何我们喜欢的事情,但在这种情况下,我们将this.data记录到控制台 - 这是可选的,但我在开发时注销结果,然后将它们剥离出去。