私はRESTとAngularJSにまったく慣れていませんが、数時間グーグルした後、私の質問に対する答えが見つかりませんでした:
POST(JPAを使用)で実装されたangularjsフロントエンドからバックエンドへのJavaリクエストを実行しようとしています。
Json-objectを作成してPOST)を実行しようとすると、常に415(サポートされていないメディアタイプ)エラーが発生します。
(実際には、サービスのスコープに「入る」ことすらできません(つまり、「IN SERVICE」はコンソールに出力されません)。postData.toJSON()を追加すると、実際には「POST」になりますが、 nullに到着.。
POSTを正常に取得するには、「postData」をどのようにフォーマットする必要がありますか?
(私はまた、 '"'なしでDateプロパティを書き込もうとしました-運がありません...)
ご協力ありがとうございました!
フロントエンド:
app.controller( 'WorkController'、function($ scope、$ http){
$scope.saveWork = function () {
var postData = {
"status" : "OPEN",
"startDate": "1338364250000",
"endDate": "1336364253400",
"WorkText" : "Test"
};
$http.post("http://localhost:8080/service/v1/saveWork", postData)
.success(function(data, status, headers, config){
console.log("IN SAVE WORK - SUCCESS");
console.log(status);
})
.error(function(){
console.log("ERROR IN SAVE WORK!");
})
}
});
サービス:
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response save(WorkDto wo){
System.out.println("IN SERVICE");
if(ass == null){
System.out.println("Could nor persist work- null");
return Response.noContent().build();
} else{
Work workDao = WorkTransformator.transform(wo);
workDao.persist();
return Response.ok().build();
}
}
ついにエラーの原因を突き止めることができました!
Rest-Serviceでは、Javaクラスをパラメーターとして直接期待していました。 (これは自動的に解析/逆シリアル化されると思いました)。かなりナイーブだと思います... :)それを機能させるために私はしなければなりませんでした:
-@ POSTサービスのパラメータとして文字列を期待する
-逆シリアル化(GSONを使用)
これが(現在機能している)サービスです:
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response save(String wo){
if(wo == null){
System.out.println("Could nor persist work- null");
return Response.noContent().build();
} else{
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HHmm:ssZ").create();
WorkDto dto = gson.fromJson(wo, WorkDto.class);
Work workDao = WorkTransformator.transform(dto);
workDao.persist();
return Response.ok().build();
}
}
アントニオさん、ありがとうございました!
解析されたJSONオブジェクトを作成して送信する代わりに、javascriptオブジェクトを作成し、投稿本文で送信します。 postDataオブジェクトを再利用できますが、プロパティ名を囲む「」を削除してみてください。
これを試して:
var postData = {
status : "OPEN",
startDate: "1338364250000",
endDate: "1336364253400",
workText : "Test"
};
[〜#〜] update [〜#〜]
上記は単独では機能しないようです。 Content-Typeが推測されると思いました。
この方法でPOSTリクエストを実行してみてください:
$http({
method: 'POST',
url: 'http://localhost:8080/service/v1/saveWork',
data: postData,
headers: {
'Content-Type': 'application/json'
}}); // complete with your success and error handlers...
// the purpose is to try to do the post request explicitly
// declaring the Content-Type you want to send.
更新2
これが機能しなかった場合は、Fiddlerを使用してPOSTリクエストを作成し、応答を確認してください。ここにいくつかの指針があります:
次に、左側のペインでサーバーの応答コードを確認できます。その行をダブルクリックします(スクリーンショットのエラーコードは無視してください... 415が表示されるはずです)
応答行をダブルクリックすると、右側のペインで詳細を確認および参照できます。
"製造された"JSONオブジェクトで正常に投稿できる場合、問題はAngularコードにあります。そうでない場合は、RestService構成に間違いがあります。
Fiddler2のAngularアプリで作成されたPOSTSの詳細を調べることもできます。これにより、何が起こっているのかについての良い洞察が得られるはずです。
あなたがそれに興味があるなら、あなたはあなたのAngularアプリリクエストのスクリーンショットであなたの質問を更新することができます。それは確かにあなたを助けるのに役立ちます:)