8

Jersey バックエンド アプリケーションを使用した AngularJS Web アプリケーションがあります。

これで、ngResource を使用して AngularJS から REST リソースにアクセスできるようになりました。唯一の問題は、DELETE オプションにあります。

ngResource を使用してコースを削除する次のコードがあります。

    Course.deleteCourse = function(course) {
    course.$remove({
        courseId:course.id
    });
    return course;
};

バックエンド (Jersey) には、次のコードがあります。

    @DELETE
@Path("{id}")
public final void remove(@PathParam("id") final String id) {
    System.out.println("DELETE ID = " + id);
}

アイテムを削除しようとすると、次の URL が Angular から呼び出されます。

DELETE http://localhost:8080/manager-api/courses/5

これでいいです(私の後)。この URL を CURL から呼び出すと、コンソールにポストされたバックエンドから ssystem.out が取得されます。

クライアント アプリ (AngularJS) では、ブラウザー コンソールで次の例外が発生します。

DELETE http://localhost:8080/manager-api/courses/5 415 (Unsupported Media Type) 

誰が問題が何であるか考えていますか? POST + GET は正常に機能しています。

次の消費/生産アノテーションがあります。

@Consumes({ MediaType.APPLICATION_JSON })

@Produces({ MediaType.APPLICATION_JSON })

よろしくお願いします。

マークに挨拶


編集:

AngularJS から REST サービスにアクセスする方法を $http に置き換えようとしました。

今私のサービスは以下のようになります:

MyApp.factory("Course", ["$http", function ($http) {
var courseBaseUrl = "/api/courses/";

return {
    show: function show(courseId) {
        return $http.get(courseBaseUrl + courseId);
    },
    list: function list() {
        return $http.get(courseBaseUrl, {});
    },
    remove: function remove(courseId) {
        return $http.delete(courseBaseUrl + courseId, {});
    },
    save: function save(course) {
        return $http.post(courseBaseUrl, course, {});
    }
};

}]);

結果はまだ同じです。アプリケーションは、例えば

DELETE http://localhost:8080/manager-api/courses/1

を受け取ります

DELETE http://localhost:8080/manager-api/courses/1 415 (Unsupported Media Type) 

Curl で同じ DELETE 呼び出しを呼び出すと、すべて正常に動作します。

助けてくれてありがとう

4

3 に答える 3

0

同じ問題がありました。delete メソッドで Course オブジェクトの新しいインスタンスを返してみてください。

@DELETE
@Path("{id}")
public final Course remove(@PathParam("id") final String id) {
  System.out.println("DELETE ID = " + id);
  return new Course();
}
于 2013-07-02T18:02:52.560 に答える
0

angularjs $resource ($http の代わりに) を使用し、リクエストに「ペイロード」を指定しないと、コンテンツ タイプは text/plain として設定されます。

したがって、私見では、サーバー側のサポートの方が優れています。「ポステルの法則は、受け取るものはリベラルで、送信するものは保守的であるべきだと述べています。 --ソース

@DELETE 
@Path("{id}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN })
public void remove(@PathParam("id") Long id) { ...
于 2013-10-28T09:46:28.180 に答える