从Angular2打电话给泽西岛

时间:2017-02-07 00:44:54

标签: json rest angular jersey jax-rs

我正在开始玩Angular2。我使用Jersey开发了一个基本的RESTful API。我测试了它,它工作正常(使用浏览器和SOAP UI)。这是代码:

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public TwoWordsMessage getMessage() {
    TwoWordsMessage message = new TwoWordsMessage();
    message.setFirstWord("hello");
    message.setSecondWord("world");
    return message;        
  }

我尝试从Angular2应用程序调用该服务:

    this.http.request(this.url).subscribe((res: Response) => {
        this.message = res.json();
    });

我可以看到(debbuging)调用“getMessage”方法并返回TwoWordsMessage对象,但Angular2应用程序永远不会得到它。与网址http://jsonplaceholder.typicode.com/posts/1相同的代码可以正常工作。

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

您是在组件或服务中调用http请求吗?函数或方法是否触发了http请求?

另外,您能否看到回复中是否有错误? subscribe方法可以将三个函数作为参数,第一个是成功,第二个是错误,第三个是完成。如果AJAX调用中存在错误(400s,500s等),则代码将永远无法处理它。试试这个:

this.http.request(this.url).subscribe((res: Response) => {
    this.message = res.json();
}, (error) => {
   console.warn(error)
});

看看吐出的是什么。要进一步调试,您甚至可以在Observable上使用.do()方法:

this.http.request(this.url)
  .do((res: Response) => console.log(res)) // or other stuff
  .subscribe((res: Response) => {
    this.message = res.json();
});

.do()方法将使用响应执行任意函数,而不会实际影响它。

如果没有,您也可以尝试将http呼叫更改为http.get()。我认为这不是问题,但Angular文档没有说明使用http.request()默认哪种方法(虽然我几乎可以肯定它是GET)。

答案 1 :(得分:0)

我终于开始工作了。这是一个CORS问题。

控制台显示错误:

  

“请求时没有'Access-Control-Allow-Origin'标头   资源“

我改变了这样的资源方法:

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response getMessage() {
    TwoWordsMessage message = new TwoWordsMessage();
    message.setFirstWord("hello");
    message.setSecondWord("world");
    return Response.status(200).header("Access-Control-Allow-Origin", "*").entity(message).build();        
  }

您可以在此处找到有用的信息:

http://www.codingpedia.org/ama/how-to-add-cors-support-on-the-server-side-in-java-with-jersey/