title: Posting to Ruby on Rails app from android
body: <p>So I am trying to post to a rails app from an Android app I am writing. I am able to post successful from inside the rails app. I was also able to post successfully using a chrome add on called Simple Rest client.</p>
  
  <p><img src="https://i.stack.imgur.com/UGHqV.png" alt="enter image description here"></p>
  
  <p>When I try and post from the Android app its hitting the rails app but creating an empty post. None of the input data is being received by rails. </p>
  
  <p>I read that 3rd party applications are only able to GET from a Rails app depending on authentication so to make sure this wasn't the issue I was having I added this to my Rails config.</p>
  
  <pre><code># de-activate tolken auth
  config.action_controller.allow_forgery_protection = false
  </code></pre>
  
  <p>At this point I am unsure as to where my issue lies, with my Rails backend or my Android client. </p>
  
  <p>ok so the Rails post method in my controller that I'm trying to reach is here</p>
  
  <pre><code># 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
  </code></pre>
  
  <p>Here is the Android java code for sending the Post Request.
  This is the method passing in the User input data I am trying to POST</p>
  
  <pre><code>private void postInformationtoAPI() {
  
                  showToast("POSTING ORDER");
                  List&lt;NameValuePair&gt; apiParams = new ArrayList&lt;NameValuePair&gt;();
                  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();
  
              }
  </code></pre>
  
  <p>And this is the class that it is passed to, permorming the HTTP POST.</p>
  
  <pre><code>public class BackGroundTaskPost extends AsyncTask&lt;String, String, JSONObject&gt; {
  
       List&lt;NameValuePair&gt; postparams = new ArrayList&lt;NameValuePair&gt;();
       String URL = null;
       String method = null;
  
       static InputStream is = null;
       static JSONObject jObj = null;
       static String json = "";
  
       public BackGroundTaskPost(String url, String method, List&lt;NameValuePair&gt; params) {
        this.URL = url;
        this.postparams = params;
        this.method = method;
  
        for (int i = 0; i &lt; 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;
  
       }
      }
  </code></pre>
  
  <p>This is the what log's out for postparams in the above class, so I know data is actually being sent</p>
  
  <pre><code>04-03 21:36:23.994: I/postparams :(690): [drinks_id=41, name=Dave, paid=True]
  </code></pre>
  
  <p>This is what Log Cat is showing as a response from the server </p>
  
  <pre><code>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"}
  </code></pre>
  
  <p>I am really struggling to understand where the issue lies with this and have been stuck on it for quite awhile. Any insight would be much appreciated. And if any more information is needed just shout. </p>
  
  <p>Edit: logs from server</p>
  
  <p>This is a successful post from the simple REST client</p>
  
  <pre><code>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"=&gt;nil, "drinks_id"=&gt;51, "id"=&gt;1021, "name"=&gt;"Test", "paid"=&gt;true, "served"=&gt;nil, "created_at"=&gt;nil, "order"=&gt;{"drinks_id"=&gt;51, "name"=&gt;"Test", "paid"=&gt;true, "served"=&gt;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)
  </code></pre>
  
  <p>This is from the android app posting </p>
  
  <pre><code>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
  </code></pre>