8

私が書いているAndroidアプリからRailsアプリに投稿しようとしています。Railsアプリ内から成功を投稿できます。また、Simple Rest クライアントと呼ばれる chrome アドオンを使用して、正常に投稿することもできました。

ここに画像の説明を入力

Androidアプリから投稿しようとすると、レールアプリにヒットしますが、空の投稿が作成されます。入力データはどれもレールによって受信されていません。

サードパーティのアプリケーションは、認証に応じて Rails アプリからのみ GET できることを読んだので、これが問題ではないことを確認するために、これを Rails 構成に追加しました。

# de-activate tolken auth
config.action_controller.allow_forgery_protection = false

この時点で、Rails バックエンドまたは Android クライアントのどこに問題があるのか​​わかりません。

わかりましたので、到達しようとしているコントローラーのRailsポストメソッドはここにあります

# POST /orders
  # POST /orders.json
  def create
    @order = Order.new(params[:order])

    respond_to do |format|
      if @order.save
        format.html { redirect_to @order, notice: 'Order was successfully created.' }
        format.json { render json: @order, status: :created, location: @order }
      else
        format.html { render action: "new" }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end

Post Request を送信するための Android Java コードを次に示します。これは、POSTしようとしているユーザー入力データを渡すメソッドです

private void postInformationtoAPI() {

                showToast("POSTING ORDER");
                List<NameValuePair> apiParams = new ArrayList<NameValuePair>();
                apiParams.add(new BasicNameValuePair("drinks_id", GlobalDrinkSelected));
                apiParams.add(new BasicNameValuePair("name", GlobalEditTextInputName));
                apiParams.add(new BasicNameValuePair("paid" , GlobalIsPaid));

                bgtPost = new BackGroundTaskPost(MAP_API_URL_POST_ORDER, "POST", apiParams);
                bgtPost.execute();

                goToOrderCompleted();

            }

これは、HTTP POST によって渡されるクラスです。

public class BackGroundTaskPost extends AsyncTask<String, String, JSONObject> {

     List<NameValuePair> postparams = new ArrayList<NameValuePair>();
     String URL = null;
     String method = null;

     static InputStream is = null;
     static JSONObject jObj = null;
     static String json = "";

     public BackGroundTaskPost(String url, String method, List<NameValuePair> params) {
      this.URL = url;
      this.postparams = params;
      this.method = method;

      for (int i = 0; i < postparams.size(); i++){
          String test = postparams.get(i).toString();
          Log.d("This is in the lisht:", test);
      }
     }

     @Override
     protected JSONObject doInBackground(String... params) {
      // TODO Auto-generated method stub
      // Making HTTP request
      try {
       // Making HTTP request
       // check for request method

       if (method.equals("POST")) {
        // request method is POST
        // defaultHttpClient

           DefaultHttpClient httpClient = new DefaultHttpClient();
           HttpPost httpPost = new HttpPost(URL);
           httpPost.setEntity(new UrlEncodedFormEntity(postparams, HTTP.UTF_8));
           Log.i("postparams : ", postparams.toString());
           httpPost.setHeader("Content-Type", "application/json");
           httpPost.setHeader("Accept", "application/json");

           HttpResponse httpResponse = httpClient.execute(httpPost);
           HttpEntity httpEntity = httpResponse.getEntity();
           is = httpEntity.getContent();

       } else if (method == "GET") {
        // request method is GET
        DefaultHttpClient httpClient = new DefaultHttpClient();
        String paramString = URLEncodedUtils
          .format(postparams, "utf-8");
        URL += "?" + paramString;
        HttpGet httpGet = new HttpGet(URL);

        HttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
       }

      } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
      } catch (ClientProtocolException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }

      try {
          Log.i("Logging out *is* before beffered reader", is.toString());
       BufferedReader reader = new BufferedReader(new InputStreamReader(
         is, "utf-8"), 8);
       Log.i("Logging out *is* after beffered reader", is.toString());
       StringBuilder sb = new StringBuilder();
       String line = null;
       while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
       }
       is.close();
       json = sb.toString();
       Log.i("json: ",json);
      } catch (Exception e) {
       Log.e("Buffer Error", "Error converting result " + e.toString());
      }

      // try parse the string to a JSON object
      try {
       jObj = new JSONObject(json);
      } catch (JSONException e) {
       Log.e("JSON Parser", "Error parsing data TEST " + e.toString());
      }

      // return JSON String
      return jObj;

     }
    }

これは、上記のクラスの postparams のログ出力なので、実際にデータが送信されていることがわかります

04-03 21:36:23.994: I/postparams :(690): [drinks_id=41, name=Dave, paid=True]

これは、Log Cat がサーバーからの応答として示しているものです。

04-03 20:56:08.247: I/json:(690): {"created_at":"2013-04-03T20:56:06Z","drinks_id":null,"id":1351,"name":null,"paid":null,"served":null,"updated_at":"2013-04-03T20:56:06Z"}

問題がどこにあるのかを理解するのに本当に苦労しており、かなり長い間立ち往生しています。どんな洞察も大歓迎です。さらに情報が必要な場合は、叫んでください。

編集:サーバーからのログ

これは単純な REST クライアントからの成功した投稿です

2013-04-03T23:13:31+00:00 app[web.1]: Completed 200 OK in 15ms (Views: 8.7ms | ActiveRecord: 5.2ms)
2013-04-03T23:13:42+00:00 app[web.1]: Started POST "/orders.json" for 89.101.112.167 at 2013-04-03 23:13:42 +0000
2013-04-03T23:13:42+00:00 app[web.1]: Processing by OrdersController#create as JSON
2013-04-03T23:13:42+00:00 app[web.1]:   Parameters: {"updated_at"=>nil, "drinks_id"=>51, "id"=>1021, "name"=>"Test", "paid"=>true, "served"=>nil, "created_at"=>nil, "order"=>{"drinks_id"=>51, "name"=>"Test", "paid"=>true, "served"=>nil}}
2013-04-03T23:13:43+00:00 heroku[router]: at=info method=POST path=/orders.json host=fyp-coffeeshop.herokuapp.com fwd="89.101.112.167" dyno=web.1 connect=1ms service=25ms status=201 bytes=138
2013-04-03T23:13:43+00:00 app[web.1]: Completed 201 Created in 15ms (Views: 0.6ms | ActiveRecord: 13.2ms)

これはAndroidアプリの投稿からのものです

2013-04-03T22:56:45+00:00 app[web.1]: Started POST "/orders.json" for 89.101.112.167 at 2013-04-03 22:56:45 +0000
2013-04-03T22:56:45+00:00 app[web.1]: Processing by OrdersController#create as JSON
2013-04-03T22:56:45+00:00 app[web.1]: Completed 201 Created in 23ms (Views: 2.2ms | ActiveRecord: 16.3ms)
2013-04-03T22:56:45+00:00 heroku[router]: at=info method=POST path=/orders.json host=fyp-coffeeshop.herokuapp.com fwd="89.101.112.167" dyno=web.1 connect=4ms service=37ms status=201 bytes=138
4

2 に答える 2

1

問題は、Android で POST をビルドするときに、エンティティ (本体) を上書きしていることです。最初に設定してから再度設定すると、すでに設定したものが効果的に消去されます。

正解です:

httpPost.setEntity(new UrlEncodedFormEntity(postparams));

しかし、数行後に次のように上書きします。

httpPost.setEntity(new StringEntity("UTF-8"));

そのため、その 2 番目のsetEntity()呼び出しを破棄します。

あなたがやろうとしていることを達成することができます - コードを次のように微調整することで、UTF-8 で POST 本文を設定します。

httpPost.setEntity(new UrlEncodedFormEntity(postparams, HTTP.UTF_8));
于 2013-04-03T23:23:25.843 に答える