0

シンプルなモバイル (Android) アプリと Web (Play 2.1.0) アプリを作成しました。これは実際には Android のもぐらたたきゲームであり、スコアを Web アプリに投稿できます (もちろん、トップ 10 スコアのリストを取得できます)。

そのため、GET トップ スコア リクエストと POST リクエストはどちらもローカルで (私のコンピューター上で) 問題なく動作します。しかし、アプリを Heroku にプッシュすると、GET トップ スコア リクエストのみが機能します。POST リクエストの問題は、私が気付いたように、(Android から) JSON を受信して​​いる Web API (Play2) コントローラーにあります。リクエストからJsonを解析する方法がわからないと思います...

私はJsonリクエストを処理するこの方法を使用します: http://www.playframework.com/documentation/2.1.0/JavaJsonRequests

問題を見つけるためにコードを変更しました。

@BodyParser.Of(BodyParser.Json.class)
public static Result newScore() {
    JsonNode json;
    try {
        json = request().body().asJson();
        String jsonString = json.toString();
        return ok(jsonString);
    } catch (Exception e1) {
        return ok("PROBLEM");
    } 
}

localhost の応答は、送信した json 文字列です。Heroku での応答は、String PROBLEM で例外がキャッチされます。これは非常に奇妙な問題です。localhost では正常に動作するのに、heroku では正常に動作しない理由がわかりません...何かアイデアはありますか? :)

更新 (Android logcat):

02-08 00:01:09.140: I/SendResultService(18709): <!DOCTYPE html>
02-08 00:01:09.140: I/SendResultService(18709): <html>
02-08 00:01:09.140: I/SendResultService(18709):     <head>
02-08 00:01:09.140: I/SendResultService(18709):         <title>Error</title>
02-08 00:01:09.140: I/SendResultService(18709):         <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlFJREFUeNqUU8tOFEEUPVVdNV3dPe8xYRBnjGhmBgKjKzCIiQvBoIaNbly5Z+PSv3Aj7DSiP2B0rwkLGVdGgxITSCRIJGSMEQWZR3eVt5sEFBgTb/dN1yvnnHtPNTPG4PqdHgCMXnPRSZrpSuH8vUJu4DE4rYHDGAZDX62BZttHqTiIayM3gGiXQsgYLEvATaqxU+dy1U13YXapXptpNHY8iwn8KyIAzm1KBdtRZWErpI5lEWTXp5Z/vHpZ3/wyKKwYGGOdAYwR0EZwoezTYApBEIObyELl/aE1/83cp40Pt5mxqCKrE4Ck+mVWKKcI5tA8BLEhRBKJLjez6a7MLq7XZtp+yyOawwCBtkiBVZDKzRk4NN7NQBMYPHiZDFhXY+p9ff7F961vVcnl4R5I2ykJ5XFN7Ab7Gc61VoipNBKF+PDyztu5lfrSLT/wIwCxq0CAGtXHZTzqR2jtwQiXONma6hHpj9sLT7YaPxfTXuZdBGA02Wi7FS48YiTfj+i2NhqtdhP5RC8mh2/Op7y0v6eAcWVLFT8D7kWX5S9mepp+C450MV6aWL1cGnvkxbwHtLW2B9AOkLeUd9KEDuh9fl/7CEj7YH5g+3r/lWfF9In7tPz6T4IIwBJOr1SJyIGQMZQbsh5P9uBq5VJtqHh2mo49pdw5WFoEwKWqWHacaWOjQXWGcifKo6vj5RGS6zykI587XeUIQDqJSmAp+lE4qt19W5P9o8+Lma5DcjsC8JiT607lMVkdqQ0Vyh3lHhmh52tfNy78ajXv0rgYzv8nfwswANuk+7sD/Q0aAAAAAElFTkSuQmCC">
02-08 00:01:09.140: I/SendResultService(18709):         <style>
02-08 00:01:09.140: I/SendResultService(18709):             html, body, pre {
02-08 00:01:09.140: I/SendResultService(18709):                 margin: 0;
02-08 00:01:09.140: I/SendResultService(18709):                 padding: 0;
02-08 00:01:09.140: I/SendResultService(18709):                 font-family: Monaco, 'Lucida Console', monospace;
02-08 00:01:09.140: I/SendResultService(18709):                 background: #ECECEC;
02-08 00:01:09.140: I/SendResultService(18709):             }
02-08 00:01:09.140: I/SendResultService(18709):             h1 {
02-08 00:01:09.140: I/SendResultService(18709):                 margin: 0;
02-08 00:01:09.140: I/SendResultService(18709):                 background: #A31012;
02-08 00:01:09.140: I/SendResultService(18709):                 padding: 20px 45px;
02-08 00:01:09.140: I/SendResultService(18709):                 color: #fff;
02-08 00:01:09.140: I/SendResultService(18709):                 text-shadow: 1px 1px 1px rgba(0,0,0,.3);
02-08 00:01:09.140: I/SendResultService(18709):                 border-bottom: 1px solid #690000;
02-08 00:01:09.140: I/SendResultService(18709):                 font-size: 28px;
02-08 00:01:09.140: I/SendResultService(18709):             }
02-08 00:01:09.140: I/SendResultService(18709):             p#detail {
02-08 00:01:09.140: I/SendResultService(18709):                 margin: 0;
02-08 00:01:09.140: I/SendResultService(18709):                 padding: 15px 45px;
02-08 00:01:09.140: I/SendResultService(18709):                 background: #F5A0A0;
02-08 00:01:09.140: I/SendResultService(18709):                 border-top: 4px solid #D36D6D;
02-08 00:01:09.140: I/SendResultService(18709):                 color: #730000;
02-08 00:01:09.140: I/SendResultService(18709):                 text-shadow: 1px 1px 1px rgba(255,255,255,.3);
02-08 00:01:09.140: I/SendResultService(18709):                 font-size: 14px;
02-08 00:01:09.140: I/SendResultService(18709):                 border-bottom: 1px solid #BA7A7A;
02-08 00:01:09.140: I/SendResultService(18709):             }
02-08 00:01:09.140: I/SendResultService(18709):         </style>
02-08 00:01:09.140: I/SendResultService(18709):     </head>
02-08 00:01:09.140: I/SendResultService(18709):     <body>
02-08 00:01:09.140: I/SendResultService(18709):         <h1>Oops, an error occured</h1>
02-08 00:01:09.140: I/SendResultService(18709):         <p id="detail">
02-08 00:01:09.140: I/SendResultService(18709):             This exception has been logged with id <strong>6d9a6k11h</strong>.
02-08 00:01:09.140: I/SendResultService(18709):         </p>
02-08 00:01:09.140: I/SendResultService(18709):     </body>
02-08 00:01:09.140: I/SendResultService(18709): </html>

解決策: OK、私は問題を解決しました - それは実際には私の Android コードの問題でした:

public void postData(String url,JSONObject obj) {
        HttpParams myParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(myParams, 10000);
        HttpConnectionParams.setSoTimeout(myParams, 10000);
        HttpClient httpclient = new DefaultHttpClient();

        try {
            HttpPost httppost = new HttpPost(url.toString());
            httppost.setHeader("Content-type", "application/json");

            StringEntity se = new StringEntity(obj.toString());
            //se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); // <-- PROBLEM
            httppost.setEntity(se); 

            HttpResponse response = httpclient.execute(httppost);
            String temp = EntityUtils.toString(response.getEntity());
            Log.i(TAG, temp);
        } 
        catch (ClientProtocolException e) {Log.e(TAG, "Client protocol ex");} 
        catch (IOException e) {Log.e(TAG, "io ex");}
    }

このコードは機能するようになりました。問題のある部分をコメントしました: BasicHeader を文字列エンティティに設定します。これは明らかに localhost では問題ではありませんでしたが、Heroku では問題でした。

4

0 に答える 0