ข้อผิดพลาดประเภทสื่อที่ไม่รองรับ Http 415 กับ JSON


115

ฉันกำลังเรียกใช้บริการ REST ด้วยคำขอ JSON และตอบสนองด้วยHTTP 415 "Unsupported Media Type"ข้อผิดพลาด

("Content-Type", "application/json; charset=utf8")ประเภทคำขอเนื้อหามีการตั้งค่า

ใช้ได้ดีถ้าฉันไม่รวมออบเจ็กต์ JSON ในคำขอ ฉันใช้google-gson-2.2.4ไลบรารีสำหรับ JSON

ฉันลองใช้สองไลบรารีที่แตกต่างกัน แต่ก็ไม่แตกต่างกัน

ใครสามารถช่วยฉันแก้ไขปัญหานี้ได้ไหม

นี่คือรหัสของฉัน:

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;

}
}

ค่าของrequestJson.toString()คือ:

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


กรุณาอัพเดตคำถามของคุณด้วยค่าrequestJson.toString()
Sabuj Hassan

1
ค่า requestJson.toString คือ: {"type": "arl", "action": "remove", "domain": "staging", "objects": " abc.com "}
user3443794

คุณได้เขียนส่วนเซิร์ฟเวอร์แล้วหรือยัง? หากคุณส่งคำขอเดียวกันกับบุรุษไปรษณีย์ (ส่วนขยายของ Chrome, Google it) ได้ผลหรือไม่? บางทีเซิร์ฟเวอร์ไม่ยอมรับประเภทเนื้อหา JSON ด้วยเหตุผลบางประการ?
joscarsson

ใช่ฉันทดสอบโดยใช้ soapUI ฉันส่งคำขอเดียวกันทั้งหมดรวมถึง json และได้รับการตอบกลับจากเซิร์ฟเวอร์
user3443794

@joscarsson ตั้งแต่ 14 มี.ค. 2017 ส่วนขยาย Chrome ของ Postman เลิกใช้งานแล้ว พวกเขาย้ายไปที่แอปเนทีฟ นี่คือบล็อกโพสต์ของพวกเขา: http://blog.getpostman.com/2017/03/14/going-native/
Serge Kishiko

คำตอบ:


81

ไม่แน่ใจเกี่ยวกับเหตุผล แต่การลบบรรทัดcharset=utf8ออกจากการ con.setRequestProperty("Content-Type", "application/json; charset=utf8")แก้ไขปัญหา


อาจเป็นข้อบกพร่องในบริการ ReST พวกเขาอาจไม่คาดว่าcharsetจะถูกตั้งค่าในประเภทเนื้อหา "application/json; charset=utf-8" == "application/json"ฉันเดาว่าพวกเขากำลังตรวจสอบว่าสตริง ดังที่กล่าวไว้ JSON ต้องเป็น utf-8 ดังนั้นจึงถูกต้องอย่างสมบูรณ์ที่จะละทิ้งชุดอักขระ
Tim Martin

20
เนื่องจากcharset=utf8ไม่ใช่การกำหนดชุดอักขระที่ถูกต้อง charset=utf-8รุ่นที่ถูกต้องจะเป็น เส้นประมีความสำคัญ รายการการกำหนดชุดอักขระที่ถูกต้องจัดการโดย IANA RFC2879: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

เสียเวลาไปนานมากในการลองสิ่งต่างๆแล้วลองลบ charset = utf8 ก็ใช้งานได้ ขอบคุณ.
Salman

53

เพิ่มContent-Type: application/jsonและAccept:application/json


1
หากคุณใช้Postmanในการทดสอบลองเพิ่มส่วนนี้ในHeaders : Content-Type: application / json
Z3d4s

13

เพราะนี่คือควรจะเป็นโดยไม่ต้องมีช่องว่างหลังcharset=utf8 application/jsonที่จะทำงานได้ดี ใช้แล้วชอบapplication/json;charset=utf-8


สิ่งนี้ไม่ถูกต้อง อนุญาตให้เว้นวรรคและควรละเว้น ดูtools.ietf.org/html/rfc2046
djb


4

หากคุณกำลังใช้AJAX jQueryคำขอนี่เป็นสิ่งจำเป็นในการสมัคร หากไม่เป็นเช่นนั้นจะทำให้คุณเกิด415ข้อผิดพลาด

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

2

เพิ่มตัวจัดการส่วนหัว HTTP และเพิ่มชื่อและค่าส่วนหัวของ API ของคุณ เช่นประเภทเนื้อหายอมรับ ฯลฯ ซึ่งจะช่วยแก้ปัญหาของคุณได้




1

ฉันแก้ไขสิ่งนี้โดยการอัปเดตRequestคลาสที่คอนโทรลเลอร์ของฉันได้รับ

ฉันลบคำอธิบายประกอบระดับชั้นเรียนต่อไปนี้ออกจากRequestชั้นเรียนของฉันทางฝั่งเซิร์ฟเวอร์ของฉัน หลังจากนั้นลูกค้าของฉันไม่ได้รับข้อผิดพลาด 415

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

1

รหัสสถานะ 415 (ชนิดสื่อที่ไม่รองรับ) บ่งชี้ว่าเซิร์ฟเวอร์ต้นทางปฏิเสธที่จะให้บริการคำขอเนื่องจากเพย์โหลดอยู่ในรูปแบบที่วิธีนี้ไม่รองรับในทรัพยากรเป้าหมาย ปัญหารูปแบบอาจเกิดจากคำขอที่ระบุประเภทเนื้อหาหรือการเข้ารหัสเนื้อหาหรือเป็นผลมาจากการตรวจสอบข้อมูลโดยตรง DOC


0

ฉันกำลังส่งคำขอพัก "ลบ" และล้มเหลวกับ 415 ฉันเห็นว่าเซิร์ฟเวอร์ของฉันใช้เนื้อหาประเภทใดในการเข้าถึง API ในกรณีของฉันมันคือ "application / json" แทนที่จะเป็น "application / json; charset = utf8"

ดังนั้นให้สอบถามจากผู้พัฒนา api ของคุณและในระหว่างนี้ให้ลองส่งคำขอด้วย content-type = "application / json" เท่านั้น


0

ฉันมีปัญหาเดียวกัน ปัญหาของฉันคือวัตถุที่ซับซ้อนสำหรับการทำให้เป็นอนุกรม Map<Object1, List<Object2>>หนึ่งแอตทริบิวต์ของวัตถุของฉันคือ ฉันเปลี่ยนแอตทริบิวต์นี้เช่นList<Object3>ที่Object3มีObject1และObject2และทุกอย่างทำงานได้ดี


0

ฉันรู้ว่านี่เป็นวิธีที่สายเกินไปที่จะช่วย OP ในการแก้ปัญหาของเขา แต่สำหรับพวกเราทุกคนที่เพิ่งประสบปัญหานี้ฉันได้แก้ไขปัญหานี้โดยการลบตัวสร้างที่มีพารามิเตอร์ของคลาสของฉันซึ่งมีไว้เพื่อเก็บข้อมูล json


0

เพิ่ม MappingJackson2HttpMessageConverter ด้วยตนเองในการกำหนดค่าช่วยแก้ปัญหาให้ฉัน:

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

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

0

เหตุผลที่ไม่สามารถเพิ่ม "annotation-driven" ในไฟล์ servlet xml ของผู้มอบหมายงานได้ และอาจเป็นเพราะไม่ได้เพิ่มเป็น application / json ในส่วนหัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.