web-dev-qa-db-ja.com

$ http.postメソッドの415(サポートされていないメディアタイプ)

私は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();
    }
}
5
nicost

ついにエラーの原因を突き止めることができました!

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();
    }
}

アントニオさん、ありがとうございました!

4
nicost

解析された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リクエストを作成し、応答を確認してください。ここにいくつかの指針があります:

  • Fiddler2をまだお持ちでない場合は、ダウンロードしてください
  • 以下のスクリーンショットのようにリクエストを作成します

Compose your POST like this

次に、左側のペインでサーバーの応答コードを確認できます。その行をダブルクリックします(スクリーンショットのエラーコードは無視してください... 415が表示されるはずです)

Double click the line with your request

応答行をダブルクリックすると、右側のペインで詳細を確認および参照できます。

You can check the request and response details

"製造された"JSONオブジェクトで正常に投稿できる場合、問題はAngularコードにあります。そうでない場合は、RestService構成に間違いがあります。

Fiddler2のAngularアプリで作成されたPOSTSの詳細を調べることもできます。これにより、何が起こっているのかについての良い洞察が得られるはずです。

あなたがそれに興味があるなら、あなたはあなたのAngularアプリリクエストのスクリーンショットであなたの質問を更新することができます。それは確かにあなたを助けるのに役立ちます:)