2013-06-29 57 views
8

我有一個AngularJS Web應用程序和Jersey後端應用程序。AngularJS和Jersey REST DELETE操作失敗,代碼爲415狀態代碼

現在一切正常,使用ngResource訪問AngularJS的REST資源。唯一的問題是使用DELETE選項。

我有下面的代碼中使用我的ngResource刪除課程:

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

在後端(新澤西州),我有以下代碼:

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

如果我嘗試刪除的項從Angular調用以下URL:

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

這很好(在我之後)。如果我從CURL調用這個URL,我會從後端發送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)

在此先感謝您的幫助。

電賀 馬克


編輯:

我試圖替換$ HTTP訪問REST服務了AngularJS的方式。

現在我的服務看起來如下:

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, {}); 
    } 
}; 

}]);

結果仍然相同。應用程序調用e.g

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

並接收

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

如果我呼籲捲曲同一DELETE召喚,一切工作正常。

感謝您的幫助 馬克

回答

0

我有同樣的問題,嘗試在你的刪除方法返回課程對象的新實例。

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

我碰到這個來爲好,問題的角度總是設置Content-Type頭爲xml的DELETE請求和球衣會另送一個錯誤,你已經指定了您的API消耗/產生JSON與註解。

所以修復(從客戶端),設置Content-Type頭,例如:

.config(function($httpProvider) { 
    /** 
    * make delete type json 
    */ 
    $httpProvider.defaults.headers["delete"] = { 
    'Content-Type': 'application/json;charset=utf-8' 
    }; 
}) 

然而,其原因我不明白/不知道的,角將剝去的內容 - 如果請求中沒有數據,請從請求中鍵入標頭。這是有道理的,如果它不是因爲瀏覽器(至少鉻)將始終發送內容類型的事實...無論如何,你將不得不去找到在角度來源中找到這個問題:

// strip content-type if data is undefined 
    if (isUndefined(config.data)) { 
    delete reqHeaders['Content-Type']; 
    } 

並擺脫它。我不知道沒有編輯源代碼的方法。也許有人擁有更好的JS知識,呃,知道如何。


另外,從服務器端,你可以做羅布建議,改變球衣配置,讓消費MediaType.APPLICATION_XML

@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
public final void remove(@PathParam("id") final String id) { 
    System.out.println("DELETE ID = " + id); 
} 
+1

另一種選擇是改變JAX-RS新澤西方允許消費MediaType.APPLICATION_XML ... @Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})。 –

+0

好點,加入回答 – paullth

+0

把「.config(函數($ httpProvider)...」放在哪裏? –

0

使用angularjs $資源(而不是$ HTTP)如果請求中沒有「有效內容」,則內容類型將設置爲文本/純文本。

所以恕我直言,它更好的服務器端支持。 「Postel's Law狀態,你應該在你接受什麼樣的自由派和保守派在你送什麼 - source

@DELETE 
@Path("{id}") 
@Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) 
public void remove(@PathParam("id") Long id) { ... 
相關問題