REST jax-rsとjerseyを使用して、POSTリクエストでJSONを消費することになっているWebサービスを作成します。私のWebサービスクラスは次のようになります。
@Path("/webhookservice")
public class Webhook {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response readData (Song song) {
// Prints out the song info
System.out.println("SONG INFO \n=======================");
System.out.println("songname: " + song.getSongname());
System.out.println("artist: " + song.getArtist());
// Repsonse with a HTTP 200 OK
Response response = Response.status(200).build();
return response;
}
}
私の歌のクラス:
public class Song {
private String songname;
private String artist;
public String getSongname () { return this.songname; }
public String getArtist () { return this.artist; }
public void setSongname (String songname) { this.songname = songname; }
public void setArtist (String artist) { this.artist = artist; }
}
私のweb.xml(必要な場合)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://Java.Sun.com/xml/ns/javaee"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>SnapScan-Webhook</servlet-name>
<servlet-class>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>za.co.lancet.service</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SnapScan-Webhook</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
RESTClient 少し、まあ、残りのクライアントを使用しています...ここに私が送信しているもののスクリーンショットがあります:
これを送信すると、415 Unsupported Media Typeエラーが表示されます。誰かが理由を知っていますか?
リクエストヘッダーを送信する必要がありますContent-Type: application/json
。 REST-Clientはこのヘッダーを自動的に追加しないようです。
他の人が指摘しているように、正しいヘッダーがありません。 「ヘッダー」にContent-Type: application/json
を追加します。
同じ415
httpエラーの時間前。 DTOクラスのデフォルトのパラメータなしコンストラクタを忘れてしまいました。 JPAエンティティの場合と同様の方法でそのコンストラクタを追加すると、私の問題と逆シリアル化が解決しましたJSON->Object
が機能するようになりました。
あなたのコードを見て、これがあなたのケースであるかどうかはわかりませんが、415 + JSONの問題を見てここにいる他の人にとっては役に立つかもしれません。よろしく
私は追加する傾向があります
@Produces({"application/json"})
トップレベルのクラス宣言に対する私のサービスに追加し、必要に応じてオーバーライドします。
例えば.
@Path("/foo")
@Produces({"application/json"})
public class FooRestService {
共有するのは馬鹿げた経験かもしれませんが、他の誰かの日を救うために共有します。
一連の関数があり、最初は注釈@BodyParser.Of(BodyParser.Json.class)
で、最初の関数は注釈行が誤ってコメント解除されたままになっているとコメントしたため、そのような注釈が2番目の関数に適用され、415メディアタイプエラーが発生しました
hth
コンテンツネゴシエーション中に一般的に表示されるエラーコードがあります1)406-受け入れられない2)415-サポートされていないメディアタイプ
406は、サーバーがリクエストのACCEPTヘッダーの下で送信されているコンテンツタイプを受け入れない場合です。
415はクライアントがリクエストヘッダーでコンテンツタイプを送信しているため、サーバーはサポートされていないメディアタイプを言うことを直接拒否します
406を克服するために、クライアントがXML入力をサーバーに理解させたい場合は、適切な依存jarを含める必要があります。その場合、サーバーにはXML関連の依存関係が必要です。
415を克服する-サーバーでサポートされているメディアタイプを理解し、リクエストのコンテンツタイプヘッダーで正しいメディアタイプを渡す
API関数のパスを指定していないことが原因の可能性があります。コードでリソースパスのみを指定しました。
@POST
@Path("/somepath")
@Consumes(MediaType.APPLICATION_JSON)
public Response readData (Song song) {
...
}