2012-04-05 13 views
5

Tôi đang thực hiện cuộc gọi jquery ajax đơn giản với dịch vụ còn lại. Tôi đang đặt contentType là "application/json" và tài nguyên còn lại được định cấu hình để chấp nhận "MediaType.APPLICATION_JSON". Đây là phương thức POST. Với thiết lập này, tôi nhận được lỗi "Loại phương tiện không được hỗ trợ".Cuộc gọi còn lại jquery ajax - Loại phương tiện không được hỗ trợ

Thông báo thông tin tiêu đề cho thấy "Content-Type application/json; charset = UTF-8" trong tiêu đề yêu cầu

đáp ứng cho thấy: Báo cáo Tình trạng: không được hỗ trợ Loại Truyền thông Máy chủ từ chối yêu cầu này vì thực thể yêu cầu ở định dạng không được tài nguyên được yêu cầu hỗ trợ cho phương thức được yêu cầu (Loại phương tiện không được hỗ trợ).

Vui lòng cung cấp một số gợi ý để giải quyết vấn đề này.

Dưới đây là đoạn mã:

Nghỉ ngơi Resource

@POST 
@Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) 
@Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) 
public Response addPerson(MyJSONObj myObj) { 
    //... 
    // ... 
    //... 
} 

jquery

$(document).ready(function() { /* put your stuff here */ 
    $("#Button_save").click(function(){ 
    var firstName = $('firstName').val(); 
    var lastName = $('lastName').val(); 
    var person = {firstName: firstName, lastName: lastName}; 
    $.ajax({ 

     url:'http://localhost:8080/sampleApplication/resources/personRestService/', 
     type: 'POST', 
     data: person, 
     Accept : "application/json", 
     contentType: "application/json", 

     success:function(res){ 
     alert("it works!"); 
     }, 
     error:function(res){ 
      alert("Bad thing happend! " + res.statusText); 
     } 
    }); 
    }); 
}); 

Headers như được hiển thị trong FF Firebug

Tiêu đề phản hồi

Content-Length 1117 
Content-Type text/html;charset=utf-8 
Date Thu, 05 Apr 2012 09:44:45 GMT 
Server Apache-Coyote/1.1 

Request Headers

Accept */* 
Accept-Encoding gzip, deflate 
Accept-Language en-us,en;q=0.5 
Connection keep-alive 
Content-Length 97 
Content-Type application/json; charset=UTF-8 
Host localhost:8080 
Referer http://localhost:8080/sampleApplication/ 
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0 
X-Requested-With XMLHttpRequest 

Trả lời

0

Dường như bạn có thể bị một trừu tượng rò rỉ. Xem phản hồi này: JQuery's getJSON() not setting Accept header correctly?

Nếu bạn đang thực hiện cuộc gọi tên miền chéo, có vẻ như bạn không thể đặt tiêu đề chấp nhận do cách jQuery tóm tắt cuộc gọi từ bạn.

Bạn nói rằng máy chủ đang nhìn thấy tiêu đề chấp nhận chính xác. Điều đó có thể chỉ ra một vấn đề khác.

2

tôi đã có cùng một vấn đề và tôi đã có thể giải quyết nó như vậy (xem http://www.weverwijk.net/wordpress/tag/jquery/):

$.ajax({ 
    url:'http://localhost:8080/sampleApplication/resources/personRestService/', 
    type:'POST', 
    data: JSON.stringify(person), 
    dataType: 'json', 
    contentType: "application/json; charset=utf-8", 
    success:function(res){ 
     alert("it works!"); 
    }, 
    error:function(res){ 
     alert("Bad thing happend! " + res.statusText); 
    } 
}); 

Về phía Java tôi đã thêm những (xem Access-Control-Allow-Origin):

@OPTIONS 
public Response testt(@Context HttpServletResponse serverResponse) { 
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); 
    serverResponse.addHeader("Access-Control-Allow-Origin", "*"); 
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); 
    serverResponse.addHeader("Access-Control-Max-Age", "60"); 
    return Response.ok().build(); 
} 

@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj, @Context HttpServletResponse serverResponse) 
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); 
    serverResponse.addHeader("Access-Control-Allow-Origin", "*"); 
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); 
    serverResponse.addHeader("Access-Control-Max-Age", "60"); 

    // ... 
    // ... 
} 

Kết luận

  • Đối tượng JSON được truyền và chuyển Automagically (chi tiết xem Configuring JSON for RESTful Web Services)
  • POST cam
  • tên miền chéo (Same-Origin-Policy)
  • Firefox làm việc (xem thẻ @Option)
+0

Đã thử nghiệm @Options và nó dường như không hoạt động, cũng tiêu đề phải được đặt trong phản hồi –

+0

bạn có thể cung cấp thêm thông tin mà lỗi xảy ra không? Bởi vì tôi sử dụng mã này trong tất cả các dự án của tôi. –

1

Tôi nghĩ rằng các bài bản gốc sẽ có đã làm việc đã mã thực hiện hai điều bổ sung:

thiết lập dữ liệu để JSON.serialize (người) và thiết lập datatype để 'json' kể từ khi contentType là đúng, điều này sẽ làm việc với các @PUT hy vọng tiêu thụ json ...

0

TRY FIRST NÀY Chuyển đổi dữ liệu của bạn sang định dạng JSON như @ wnm3 gợi ý.

NẾU VẪN gặp phải vấn đề CONTINUE -

này đã giúp tôi, nếu cú ​​pháp Yêu cầu của bạn là đúng. Đây là điều tôi đã làm để xóa lỗi 415 Không được hỗ trợ -

@PUT 
//REMOVE THIS LINE !!!!!! ----- @Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj) 

    // 
    //Your code here 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

Tôi chính xác không biết, cách yêu cầu CORS sẽ gửi và chấp nhận đơn đăng ký/json. Câu trả lời được đưa ra bởi @Tobias Sarnow là một phần không chính xác. Vì bạn không cần phương thức chấp nhận yêu cầu OPTIONS. Ngay cả khi trình duyệt đang hiển thị rằng nó sẽ gửi yêu cầu OPTIONS, trình duyệt vẫn sẽ tìm phương thức có chú thích @POST. Vì vậy, thay vì đưa lên một bộ lọc hoặc làm một cái gì đó khác (cách tinh tế hơn), tôi đã sửa chữa nhanh chóng bằng cách sử dụng một phương pháp khác không có @Consumes và @Produces. Example-

@PUT 
public Response addPerson() { 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

@PUT 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj) 
    // 
    //Your code here 
    // 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

Vì vậy, những gì đang xảy ra ở đây là như CORS ban đầu cho OPTIONS được xử lý bằng phương pháp đầu tiên sau đó phương pháp thứ hai xử lý các yêu cầu PUT gốc.

Tôi đưa câu trả lời này ở đây vì tôi mất 3-4 ngày để tìm hiểu lý do tại sao yêu cầu PUT của tôi không được thực hiện. Vì vậy, nó có thể giúp một người có lỗi 415.