5

Play フレームワーク 2.1.1 (Java) に問題があり、無効な JSON を送信していると通知されます。Play フレームワーク 2.x と 2.1.0 で同様の/おそらく同じ問題が発生しましたが、Play Framework 2.1.1 で解決されているはずでした: Play Framework 2.1 で無効な JSON を参照してください。

これは私がコードで行っていることです。少し短くしようとしました:

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import play.libs.Json;
import play.mvc.BodyParser;

@BodyParser.Of(BodyParser.Json.class)
public static Result login() {
    JsonNode json = request().body().asJson();
}

私が実行すると:

curl -v -H "Content-Type: application/json" -X POST -d '{"email":"test@test.de","password":"test"}' http://localhost:9000/mobile/login

次の応答が返されます。

< HTTP/1.1 400 Bad Request
< Content-Type: text/html; charset=utf-8
< Content-Length: 1917
...
<p id="detail">
    For request 'POST /mobile/login' [Invalid Json]
</p>
...

プロジェクトをクリーンアップして、数回再実行しました。play aboutを実行すると、次の出力が得られます。

[info] Loading project definition from /path/to/project
[info] Set current project to FFPushAlarmPlay (in build file:/path/to)
[info] This is sbt 0.12.2
[info] The current project is {file:/path/to}...
[info] The current project is built against Scala 2.10.0
[info] Available Plugins: play.Project, sbt.PlayProject, com.typesafe.sbteclipse.plugin.EclipsePlugin, com.typesafe.sbtidea.SbtIdeaPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.9.2

私はひどく間違ったことをしていますか?これは私の最初の Play 2 プロジェクトであるため、どんな助けも大歓迎です!

更新: AFNetworking を使用して JSON を自動的に構築する iOS クライアントもあり、そこでも無効な JSON 応答が返されることを忘れていました。したがって、これを引き起こしているのは無効なJSONではないようです...

4

3 に答える 3

14

あなたのコードには何も問題はありません。Windows コマンド ライン ( CMD.exe) を使用して実行していcurlますか? を使用CMD.exeして実行するcurl場合は、渡す JSON 形式のデータを修正する必要があります。Windows では、quote の使用は UNIX マシンとは少し異なると思います。

最も簡単な修正方法は、一重引用符の使用を避け、JSON データの開始と終了に二重引用符を使用することです。JSON データ内の二重引用符は(文字単位で)エスケープ\されます。少し面倒かもしれませんが、うまくいくはずです。

curl -v -H "Content-Type: application/json" -X POST -d "{\"email\":\"test@test.de\",\"password\":\"test\"}" http://localhost:9000/mobile/login

または、UNIX マシンのように動作する可能性があるため、Windows用のcygwinまたはその他の UNIX ライクなコマンド ラインを代替コマンド ラインとして使用できます。

それがあなたの友人に役立つことを願っています。:)

于 2013-05-13T02:31:40.000 に答える
-1

私はCMDで同じ問題を抱えていましたが、これで問題が解決しました:

C:\Windows\System32>curl -v -u login:password -X PUT -d "{\"test\":\"aaa\",\"name\":\"Kowalski\"}" http://127.0.0.1:5984/albums/2340234802938424f7w783

PS プログラム Cygwin では、この問題は発生しません。

于 2015-05-14T19:59:50.960 に答える