2017-03-14 22 views
0

私はRestESTY JAX-RSサービスを呼び出すAngular2クライアントを持っています。私が得ようとしているのはJSON形式の "Hello World"メッセージです。私はJSONオブジェクトを期待していたが、私は次のような構造を持つ私の応答を得る:RestEasy - JSONレスポンス - Angular2クライアントから、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からそれを得るために:それはそれを変更する方法があり、RESTEasyの設定の事

this.service.getHello() 
    .then(result => { 
     this.message = JSON.parse(result._body).message; 
     console.log(this.message);//Hello World 
    }); 

ですか?

それとも

は、私はいつも自分のデータと私の応答フィールド_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のバージョンがWildfly 10.1.0.Finalに3.1.1.Finalランニングで

答えて

2

何あなたはHttpリクエストからResponseオブジェクトを取得しています。これがすべてのHttp操作が返すものです。それからJSONをパースする最も簡単な方法は、あなたがgetHelloだけの(呼び出し側クライアント上で)それを解析することなく、オブジェクトを返すようにしたい場合は、単にそれに

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

json()メソッドを呼び出すことで、その後のことができます。 、(Observable.map操作を使用して)それをマッピングすることにより、getHelloメソッドの内部でそれを行う

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

Angular HTTPModuleを使用しているので、実際には応答オブジェクトが作成されていることに気付きませんでした。私は私のサービスクラス 'rxjs/Rx'でも使っています。これをObservableの代わりにPromiseに変換すると、次のようになります。 'return this.http.get(this.baseURL + 'hello/world')。toPromise();しかしObservablesを使うのは正しい方法ですか? –

+1

"正しい"方法について私は知らない。それは単なる好みかもしれません。しかし、あなたは確かにObservable演算子を使用してから約束をすることになります(これはあなたが選んだものです) –

1

にpeeskilletは、上記の言うように、あなたは要求から応答全体をバック取得している、そして時にはあなたは、ヘッダーを調べたいかもしれないがおそらく、さまざまな戻り条件を処理する(再試行またはリダイレクトたとえば、4xxまたは5xxの応答では)、ほとんどの場合、要求が成功したものとみなし、ペイロードだけを必要とします。

Angular2はので、あなたのサービスがこのようなものに見えるかもしれませんが、観測の使用を奨励:

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として解析します.JSONは購読するObservableも返します。、this.dataに - データ -

購読は、我々は、ペイロードを割り当てる成功に上記の例では、3つのコールバック関数、 .subscribe(成功故障、完全

を有しますサブスクライブに失敗した場合は、エラーをログに記録し、を完了すると、私たちは何でもできますが、この場合はコンソールにthis.dataを記録します。これはオプションですが、デベロpingしてから後で取り除きます。

関連する問題