私は実際にはRESTWSに慣れていませんが、実際にはこの415 Unsupported Media Type
を取得していません。
私はFirefox上のPosterで私のRESTをテストしています、そしてGET
もPOST
(それが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;
}
}
問題は、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/
REST ClientヘッダーセクションにContent-Type: application/json
とAccept: application/json
を追加します。
万が一これが他の人に役立つ場合は、これが私の逸話です:
Postmanを使用してRESTEasyサーバーにテストデータを送信していたときに発生した問題の結果として、このスレッドが見つかりました。
手短に言えば、私はすべてを引き裂いて、結局私はうまくいったと知っている簡単なファイルアップロードの例を実行しようとしました。そうではありませんでした。それが、問題が私のPostmanの要求にあることに気付いた時です。通常は特別なヘッダを送信しませんが、前回のテストで "Content-Type": "application/json"ヘッダを追加しました。もちろん、私は「multipart/form-data」をアップロードしようとしていました。それを削除すると私の問題は解決しました。
道徳的:あなたの世界を爆破する前にあなたのヘッダーをチェックしてください。 ;)
私はこの問題を抱えていて、問題は私が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
私は同じ問題を抱えていた:
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>
私は同じ問題を抱えています。実際、リクエストはジャージーアノテーション付きメソッドに届きませんでした。アノテーションを追加して問題を解決しました:@Consumes(MediaType.APPLICATION_FORM_URLENCODED)アノテーション@Consumes( "/")は動作しません
@Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
@POST
//@Consumes("*/*")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void get__EstNouvelleGH( @Context HttpServletResponse response) {
...
}
あなたのメソッドにStringを返さないでください、しかし、Customerはそれを自分自身に反対し、JAXBに逆シリアル化の世話をさせます。
GoogleのARCアプリを使用してXML
を投稿しようとしたときにこのエラーが発生する場合は、ボディコンテンツタイプをapplication/xml
に変更してみてください。 ここの例
pOST/PUTなどでJSONを使用する場合は、content-typeをapplication/jsonに変更するだけです。
私がすでに持っている間に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ファイルを追加します。
私がそうしたように、それが他の人にもうまくいくことを願っています。