Http 415 Lỗi loại phương tiện không được hỗ trợ với JSON


115

Tôi đang gọi một dịch vụ REST với một yêu cầu JSON và nó phản hồi với một HTTP 415 "Unsupported Media Type"lỗi.

Loại nội dung yêu cầu được đặt thành ("Content-Type", "application/json; charset=utf8").

Nó hoạt động tốt nếu tôi không bao gồm một đối tượng JSON trong yêu cầu. Tôi đang sử dụng google-gson-2.2.4thư viện cho JSON.

Tôi đã thử sử dụng một vài thư viện khác nhau nhưng không có gì khác biệt.

Ai có thể vui lòng giúp tôi giải quyết vấn đề này?

Đây là mã của tôi:

public static void main(String[] args) throws Exception
{

    JsonObject requestJson = new JsonObject();
    String url = "xxx";

    //method call for generating json

    requestJson = generateJSON();
    URL myurl = new URL(url);
    HttpURLConnection con = (HttpURLConnection)myurl.openConnection();
    con.setDoOutput(true);
    con.setDoInput(true);

    con.setRequestProperty("Content-Type", "application/json; charset=utf8");
    con.setRequestProperty("Accept", "application/json");
    con.setRequestProperty("Method", "POST");
    OutputStream os = con.getOutputStream();
    os.write(requestJson.toString().getBytes("UTF-8"));
    os.close();


    StringBuilder sb = new StringBuilder();  
    int HttpResult =con.getResponseCode();
    if(HttpResult ==HttpURLConnection.HTTP_OK){
    BufferedReader br = new BufferedReader(new   InputStreamReader(con.getInputStream(),"utf-8"));  

        String line = null;
        while ((line = br.readLine()) != null) {  
        sb.append(line + "\n");  
        }
         br.close(); 
         System.out.println(""+sb.toString());  

    }else{
        System.out.println(con.getResponseCode());
        System.out.println(con.getResponseMessage());  
    }  

}
public static JsonObject generateJSON () throws MalformedURLException

{
   String s = "http://www.example.com";
        s.replaceAll("/", "\\/");
    JsonObject reqparam=new JsonObject();
    reqparam.addProperty("type", "arl");
    reqparam.addProperty("action", "remove");
    reqparam.addProperty("domain", "staging");
    reqparam.addProperty("objects", s);
    return reqparam;

}
}

Giá trị của requestJson.toString()là:

{"type":"arl","action":"remove","domain":"staging","objects":"http://www.example.com"}


Vui lòng cập nhật câu hỏi của bạn với giá trị làrequestJson.toString()
Sabuj Hassan.

1
Giá trị của requestJson.toString là: { "loại": "arl", "hành động": "remove", "miền": "dàn", "đối tượng": " abc.com "}
user3443794

Bạn đã viết phần máy chủ chưa? Nếu bạn thực hiện yêu cầu tương tự với Postman (tiện ích mở rộng của Chrome, Google it), nó có hoạt động không? Có lẽ máy chủ không chấp nhận kiểu nội dung JSON vì lý do nào đó?
joscarsson

Có, tôi đã thử nghiệm điều đó bằng cách sử dụng soapUI. Tôi đã gửi cùng một yêu cầu bao gồm json và nhận được phản hồi thành công từ máy chủ.
user3443794

@joscarsson, kể từ ngày 14 tháng 3 năm 2017, tiện ích mở rộng của Chrome Postman không được dùng nữa. Họ đã chuyển sang ứng dụng gốc. Đây là bài đăng trên blog của họ: http://blog.getpostman.com/2017/03/14/going-native/
Serge Kishiko

Câu trả lời:


81

Không chắc về lý do nhưng Xóa dòng charset=utf8khỏi đã con.setRequestProperty("Content-Type", "application/json; charset=utf8")giải quyết được sự cố.


Có thể đó là một lỗi trong dịch vụ ReST. Chúng có thể không được mong đợi sẽ charsetđược đặt trong Loại-Nội dung. Tôi đoán là họ đang kiểm tra xem chuỗi "application/json; charset=utf-8" == "application/json". Điều đó đang được nói, JSON phải là utf-8 vì vậy hoàn toàn hợp lệ để loại bỏ bộ ký tự.
Tim Martin

19
Bởi vì charset=utf8không phải là một chỉ định bộ ký tự hợp lệ. Phiên bản chính xác sẽ là charset=utf-8. Dấu gạch ngang là quan trọng. Danh sách các định danh bộ ký tự hợp lệ được quản lý bởi IANA RFC2879: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

Đã lãng phí rất nhiều thời gian để thử những thứ khác nhau và sau đó thử xóa ký tự = utf8 và nó hoạt động. Cảm ơn.
Salman

53

Thêm Content-Type: application/jsonAccept:application/json


1
Nếu bạn sử dụng Postman để thử nghiệm, cố gắng thêm phần này vào Headers : Content-Type: application / json
Z3d4s

13

Điều này là do charset=utf8nên không có khoảng trắng sau application/json. Điều đó sẽ hoạt động tốt. Sử dụng nó nhưapplication/json;charset=utf-8


Điều này là không đúng; khoảng trắng được phép và nên bỏ qua; xem tools.ietf.org/html/rfc2046 .
djb

11

Nếu bạn đang đưa ra yêu cầu jquery ajax, đừng quên thêm

contentType:'application/json'

4

Nếu bạn đang sử dụng AJAX jQueryYêu cầu, đây là điều bắt buộc phải áp dụng. Nếu không nó sẽ ném bạn 415Lỗi.

dataType: "json",
contentType:'application/json'

2

Thêm trình quản lý tiêu đề HTTP và thêm vào đó các giá trị và tên tiêu đề API của bạn. ví dụ: Loại nội dung, Chấp nhận, v.v. Điều đó sẽ giải quyết vấn đề của bạn.


2

Nếu bạn nhận được điều này trong phần mềm trung gian React RSAA hoặc tương tự, hãy thêm tiêu đề:

  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(model),


1

Tôi đã sửa lỗi này bằng cách cập nhật Requestlớp mà Bộ điều khiển của tôi nhận được.

Tôi đã xóa chú thích cấp lớp sau khỏi Requestlớp của mình ở phía máy chủ. Sau đó, khách hàng của tôi không gặp lỗi 415.

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement

1

Mã trạng thái 415 (Loại phương tiện không được hỗ trợ) chỉ ra rằng máy chủ gốc đang từ chối phục vụ yêu cầu vì tải trọng ở định dạng không được phương pháp này hỗ trợ trên tài nguyên đích. Vấn đề định dạng có thể là do Loại Nội dung hoặc Mã hóa Nội dung được chỉ định trong yêu cầu hoặc do kiểm tra dữ liệu trực tiếp. DOC


0

Tôi đã gửi yêu cầu nghỉ ngơi "xóa" và nó không thành công với 415. Tôi đã thấy máy chủ của mình sử dụng loại nội dung nào để truy cập api. Trong trường hợp của tôi, đó là "application / json" thay vì "application / json; charset = utf8".

Vì vậy, hãy hỏi từ nhà phát triển api của bạn Và trong thời gian chờ đợi, hãy thử gửi yêu cầu chỉ với content-type = "application / json".


0

Tôi gặp vấn đề tương tự. Vấn đề của tôi là đối tượng phức tạp để tuần tự hóa. Một thuộc tính của đối tượng của tôi là Map<Object1, List<Object2>>. Tôi đã thay đổi thuộc tính này như List<Object3>nơi Object3chứa Object1Object2và tất cả mọi thứ hoạt động tốt.


0

Tôi biết đây là quá muộn để giúp OP giải quyết vấn đề của anh ấy, nhưng đối với tất cả chúng ta, những người đang gặp phải vấn đề này, tôi đã giải quyết vấn đề này bằng cách loại bỏ hàm tạo với các tham số của Lớp của tôi được dùng để giữ dữ liệu json.


0

Thêm MappingJackson2HttpMessageConverter theo cách thủ công trong cấu hình đã giải quyết được vấn đề cho tôi:

@EnableWebMvc
@Configuration
@ComponentScan
public class RestConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(new MappingJackson2HttpMessageConverter());
        super.configureMessageConverters(messageConverters);
    }
}

0

Lý do có thể là không thêm "annotation-driven" trong tệp xml servlet điều phối viên của bạn. và cũng có thể do không thêm dưới dạng ứng dụng / json trong tiêu đề

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.