5

私はjsonRESTapiを構築するためにjacksonでRestlet2.1を使用しています。

予期されたコンテンツタイプで不正な形式の本文でリクエストを行うと、415の「サポートされていないメディアタイプ」ステータスコードが返されます。正しいエラーコードは400「BadRequest」だと思います。

どうやら、ジャクソンがゴミをデコードしようとして失敗したときに混乱が発生しているようです。

いくつかのコードを使用して、ケースをより明確にしようとします。

// java method mapping
@Post("json")
public Project create(Project project) {

curlを使用したサービスの呼び出し

$ curl -i -XPOST -H 'content-type: application/json' -d '{xgarbage}' http://localhost:8080/projects HTTP/1.1 415 Unsupported Media Type

そして、ログに記録されたスタックトレースの断片:

Nov 29, 2010 9:51:56 PM org.restlet.ext.jackson.JacksonRepresentation getObject
WARNING: Unable to parse the object with Jackson.
org.codehaus.jackson.JsonParseException: Unexpected character ('x' (code 120)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: java.io.ByteArrayInputStream@693e4a5a; line: 1, column: 2]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:929)

サービスの実際の実装がヒットすることはないため、どこかで文字化けしたコンテンツを415にマップすることが決定されます。

さて、私の質問は:これは正しいですか?「RESTfulWebサービス」という本からの次の引用を正しく読んでいれば、そうではありませんが、訂正の余地があります。

[400 Bad Request]これは、クライアントがPUTまたはPOSTリクエストとともに表現を送信し、表現が正しい形式である場合によく使用されますが、意味がありません。

[415サポートされていないメディアタイプ]クライアントが正しいメディアタイプを持っているが間違ったフォーマットのドキュメント(間違った語彙で書かれたXMLドキュメントなど)を送信する場合、より一般的な400(「不正な要求」)がより適切な応答になります。

正しいか間違っているか、私は400を返したいと思います。

ジャクソンが提供する自動マジックシリアル化を放棄せずに動作を変更する方法はありますか?

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

3

とにかく破損している場合、リクエストは正しい形式ではないため、415は正しいです。たとえば、解析不可能な JSON または XML です。不正な形式の JSON または XML は、定義上、JSON または XML ではないため、サポートされていないメディア タイプです。Jackson がそれが JSON であると想定されていることを知る方法はありません。Jackson は、解析できる JSON ではないことを知っているだけです。

公式ドキュメントはこれについて非常に明確です。

10.4.16 415 サポートされていないメディア タイプです

リクエストのエンティティが、リクエストされたメソッドのリクエストされたリソースでサポートされていない形式であるため、サーバーはリクエストの処理を拒否しています。

あなたは言った、これはJSONであり、サーバーが言うように、私が得たのはJSONではなく、このリソースではサポートされていません。

于 2010-11-30T00:04:07.967 に答える