web-dev-qa-db-ja.com

エラー415サポートされていないメディアタイプ:JSONの場合POSTがRESTに達していませんが、XMLの場合は達しています

私は実際にはRESTWSに慣れていませんが、実際にはこの415 Unsupported Media Typeを取得していません。

私はFirefox上のPosterで私のRESTをテストしています、そしてGETPOST(それがapplication/xmlの時)もうまく動くのですが、application/jsonを試すとWSには届きません、サーバーそれを拒否します。

これは私のURLです:http:// localhost:8081/RestDemo/services/customers/add

これは私が送っているJSONです:{"name": "test1", "address" :"test2"}

これは私が送っているXMLです:

<customer>
    <name>test1</name>
    <address>test2</address>
</customer>

これが私のリソースクラスです。

@Produces("application/xml")
@Path("customers")
@Singleton
@XmlRootElement(name = "customers")
public class CustomerResource {

    private TreeMap<Integer, Customer> customerMap = new TreeMap<Integer, Customer>();

    public  CustomerResource() {
        // hardcode a single customer into the database for demonstration
        // purposes
        Customer customer = new Customer();
        customer.setName("Harold Abernathy");
        customer.setAddress("Sheffield, UK");
        addCustomer(customer);
    }

    @GET
    @XmlElement(name = "customer")
    public List<Customer> getCustomers() {
        List<Customer> customers = new ArrayList<Customer>();
        customers.addAll(customerMap.values());
        return customers;
    }

    @GET
    @Path("/{id}")
    @Produces("application/json")
    public String getCustomer(@PathParam("id") int cId) {
        Customer customer = customerMap.get(cId); 
        return  "{\"name\": \" " + customer.getName() + " \", \"address\": \"" + customer.getAddress() + "\"}";

    }

    @POST
    @Path("/add")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public String addCustomer(Customer customer) {
         //insert 
         int id = customerMap.size();
         customer.setId(id);
         customerMap.put(id, customer);
         //get inserted
         Customer result = customerMap.get(id);

         return  "{\"id\": \" " + result.getId() + " \", \"name\": \" " + result.getName() + " \", \"address\": \"" + result.getAddress() + "\"}";
    }

}

編集1:

これは私の顧客クラスです:

@XmlRootElement 
public class Customer implements Serializable {

    private int id;
    private String name;
    private String address;

    public Customer() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}
71
mzereba

問題は、Bean Customerの逆シリアル化にあります。あなたのプログラムは、Danielが書いているJAXBを使ってXMLでそれを行う方法を知っていますが、ほとんどの場合JSONでそれを行う方法を知りません。

これがResteasy/Jacksonの例です http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

ジャージーと同じ: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

19
unludo

REST ClientヘッダーセクションにContent-Type: application/jsonAccept: application/jsonを追加します。

126
Anup Awasthi

万が一これが他の人に役立つ場合は、これが私の逸話です:

Postmanを使用してRESTEasyサーバーにテストデータを送信していたときに発生した問題の結果として、このスレッドが見つかりました。

手短に言えば、私はすべてを引き裂いて、結局私はうまくいったと知っている簡単なファイルアップロードの例を実行しようとしました。そうではありませんでした。それが、問題が私のPostmanの要求にあることに気付いた時です。通常は特別なヘッダを送信しませんが、前回のテストで "Content-Type": "application/json"ヘッダを追加しました。もちろん、私は「multipart/form-data」をアップロードしようとしていました。それを削除すると私の問題は解決しました。

道徳的:あなたの世界を爆破する前にあなたのヘッダーをチェックしてください。 ;)

14
Max P Magee

私はこの問題を抱えていて、問題は私がJacksonFeatureクラスを登録していなかったことであることがわかりました:

// Create JAX-RS application.
final Application application = new ResourceConfig()
    ...
    .register(JacksonFeature.class);

これをしないと、アプリケーションはJSONをJavaオブジェクトに変換する方法を知りません。

https://jersey.Java.net/documentation/latest/media.html#json.jackson

3
David Hopkins

私は同じ問題を抱えていた:

curl -v -H "コンテンツタイプ:application/json" -X PUT -d '{"名前": "json"、 "姓": "gson"、 "結婚":true、 "年齢":32、 "給与 ":123、" hasCar ":true、"チャイルド ":[" serkan "、" volkan "、" aybars "]} 'XXXXXX/ponyo/UserModel/json

* About to connect() to localhost port 8081 (#0)
*   Trying ::1...
* Connection refused
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 8081 (#0)
> PUT /ponyo/UserModel/json HTTP/1.1
> User-Agent: curl/7.28.1
> Host: localhost:8081
> Accept: */*
> Content-Type: application/json
> Content-Length: 121
> 
* upload completely sent off: 121 out of 121 bytes
< HTTP/1.1 415 Unsupported Media Type
< Content-Type: text/html; charset=iso-8859-1
< Date: Wed, 09 Apr 2014 13:55:43 GMT
< Content-Length: 0
< 
* Connection #0 to Host localhost left intact
* Closing connection #0

次のようにpom.xmlに依存関係を追加して解決しました。試してみてください。

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.98</version>
    </dependency>
1
User9527

私は同じ問題を抱えています。実際、リクエストはジャージーアノテーション付きメソッドに届きませんでした。アノテーションを追加して問題を解決しました:@Consumes(MediaType.APPLICATION_FORM_URLENCODED)アノテーション@Consumes( "/")は動作しません

    @Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
    @POST
    //@Consumes("*/*")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void  get__EstNouvelleGH( @Context HttpServletResponse response) {
        ...
    }
1
Bertrand

あなたのメソッドにStringを返さないでください、しかし、Customerはそれを自分自身に反対し、JAXBに逆シリアル化の世話をさせます。

0
Daniel Kutik

GoogleのARCアプリを使用してXMLを投稿しようとしたときにこのエラーが発生する場合は、ボディコンテンツタイプをapplication/xmlに変更してみてください。 ここの例

0
swati shilpa

pOST/PUTなどでJSONを使用する場合は、content-typeをapplication/jsonに変更するだけです。

0
Chirag

私がすでに持っている間にjsonを使用してポストコールを打っている間それが error-415-unsupported-media-type を与えていたので私は同じ問題を抱えていた

@Consumes(MediaType.APPLICATION_JSON) 

そして、Jersey 2.0を使った私の安らかなWebサービスのようにヘッダを要求します+

Accept:application/json
Content-Type:application/json

プロジェクトに以下の依存関係を追加することで、この問題を解決しました

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>

これはあなたのライブラリに以下のjarファイルを追加します。

  1. jersey-media-json-jackson-2.25.jar
  2. jersey-entity-filtering-2.25.jar
  3. jackson-module-jaxb-annotations-2.8.4.jar
  4. jackson-jaxrs-json-provider-2.8.4.jar
  5. jackson-jaxrs-base-2.8.4.jar

私がそうしたように、それが他の人にもうまくいくことを願っています。

0
Prakhar Agrawal