android - 从 Android 发布到 Ruby on Rails 应用程序

标签 android ruby-on-rails http post

所以我试图从我正在编写的 Android 应用程序发布到 Rails 应用程序。我能够从 Rails 应用程序内部成功发布。我还能够使用名为 Simple Rest 客户端的 chrome 插件成功发布。

enter image description here

当我尝试从 Android 应用程序发帖时,它点击了 Rails 应用程序但创建了一个空帖子。 rails 没有接收到任何输入数据。

我读到第 3 方应用程序只能根据身份验证从 Rails 应用程序获取,因此为确保这不是我遇到的问题,我将其添加到我的 Rails 配置中。

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

此时我不确定我的问题出在哪里,是我的 Rails 后端还是我的 Android 客户端。

好的,我尝试访问的 Controller 中的 Rails post 方法就在这里

# 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 请求的 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)

这是来自安卓应用的帖子

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

最佳答案

您正在设置 JSON 的内容类型但实际上并未发送 JSON,您发送的是标准的 POST url 编码参数。

您需要实际发送一个 JSON 对象:

JSONObject params = new JSONObject();
params.put("drinks_id", GlobalDrinkSelected);
params.put("name", GlobalEditTextInputName);
params.put("paid", GlobalIsPaid);

StringEntity entity = new StringEntity(params.toString());
httpPost.setEntity(entity);

关于android - 从 Android 发布到 Ruby on Rails 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15797979/

相关文章:

ios - URI 中 vCard 的标签

android - 位置重启后 Google Play 服务位置不可用

ruby-on-rails - Rails 3 View 中是否接受查询?

ios - 如何使用 NSURLSession 验证进入该网站?

ruby-on-rails - Rbenv 后 Rails Gem 安装失败

ruby-on-rails - 如何在 Rails 7 Minitest 中设置命名空间模型装置?

http - Varnish:使缓存依赖于 X-Forwarded-Proto https

android - Out of Memory - 内存优化

java - fragment.isVisible() 总是返回 false

java - 在 fragment 中显示两个溢出菜单