2017-02-07 20 views
1

Я начинаю играть с Angular2. Я разработал базовый API RESTful, используя Джерси. Я тестировал его, и он отлично работает (с браузером и SOAP UI). Это код:Вызов Джерси из Angular2

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

Я tryng для вызова службы из приложения Angular2:

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

Я могу видеть (debbuging), что метод «GetMessage» вызывается и возвращает TwoWordsMessage но приложение Angular2 никогда не получает его. Тот же код с адресом http://jsonplaceholder.typicode.com/posts/1 работает отлично.

Что я делаю неправильно?

Спасибо!

+0

что ваш RESTful ответ выглядит? –

+0

кажется, что сервер ng2 ждет ответа или не знает, как его обрабатывать. Он никогда не попадает в 'code'this.message = res.json();' code' –

+0

Вы проверили консоль разработчика? Любые ошибки? Может быть, ошибка CORS? –

ответ

1

Вы вызываете запрос http внутри компонента или службы? Предотвращает ли функция или метод HTTP-запрос?

Кроме того, вы можете видеть, есть ли ошибки, возвращающиеся из ответа? Метод subscribe может принимать три функции в качестве параметров, первый из которых находится на этапе успеха, второй по ошибке, третий по завершении. Если в вызове AJAX (400s, 500s и т. Д.) Есть ошибка, ваш код никогда не сможет справиться с этим. Попробуйте следующее:

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

и посмотрите, что выплевываете. Для дальнейшей отладки, вы можете даже использовать метод .do() на Observable:

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 docs не указано, какой метод по умолчанию имеет значение http.request() (хотя я был бы почти уверен, что это GET).

0

Я, наконец, получил его работу. Это проблема CORS.

Консоль показала ошибку:

"No 'Access-Control-Allow-Origin' header is present on the requested resource"

Я изменил метод ресурса, как это:

@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/