Android发布到Rails服务器

Android发布到Rails服务器,android,ruby-on-rails,Android,Ruby On Rails,我正在尝试设置一个调查,我的应用程序用户可以进行该调查,并将结果发布到rails应用程序。调查/问题/答案构建在rails应用程序中,然后显示在Android应用程序中。用户回答每个问题后,应将其发回服务器 我怀疑这与我的创建方法有关(未注释的行用于在rails应用程序中创建选项,但不适用于Android post,注释的行似乎两者都不适用),但我对Android/rails比较陌生,因此非常感谢您的帮助 这是我的选择控制器: class ChoicesController < Appli

我正在尝试设置一个调查,我的应用程序用户可以进行该调查,并将结果发布到rails应用程序。调查/问题/答案构建在rails应用程序中,然后显示在Android应用程序中。用户回答每个问题后,应将其发回服务器

我怀疑这与我的创建方法有关(未注释的行用于在rails应用程序中创建选项,但不适用于Android post,注释的行似乎两者都不适用),但我对Android/rails比较陌生,因此非常感谢您的帮助

这是我的选择控制器:

class ChoicesController < ApplicationController

  # POST /choices
  # POST /choices.json
  def create
    @question = Question.find(params[:question_id])
    @choice = @question.choices.build(choice_params)
    @choice.answer = Answer.find(params[:choice][:answer_id])
    # @choice.answer = Answer.find(params[:answer_id])

    respond_to do |format|
      if @choice.save
        format.html { redirect_to question_choices_path, notice: 'Choice was successfully created.' }
        format.json { render action: 'show', status: :created, location: @choice }
      else
        format.html { render action: 'new' }
        format.json { render json: @choice.errors, status: :unprocessable_entity }
      end
    end
  end
类选择控制器
我的选择模式:

class Choice < ActiveRecord::Base
  belongs_to :question
  belongs_to :answer
  belongs_to :user
  validates :question_id, presence: true
  validates :answer_id, presence: true
end
类选择
以下是我在Android中创建/发布json的方式:

public boolean postChoice(String apiKey) {
        boolean choicePosted = false;

        try {
            post();
        } catch (Exception e) {
            e.printStackTrace();
        }
        choicePosted = true;
        return choicePosted;
    }
    public static void post() {
        Map<String, String> choice = new HashMap<String, String>();
        choice.put("question_id", "6");
        choice.put("answer_id", "15");
        String json = new GsonBuilder().create().toJson(choice, Map.class);
        makeRequest("http://localhost:3000/choices/", json);
    }

    public static HttpResponse makeRequest(String uri, String json) {
        try {
            HttpPost httpPost = new HttpPost(uri);
            httpPost.setEntity(new StringEntity(json));
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
            return new DefaultHttpClient().execute(httpPost);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
公共布尔后置选择(字符串apiKey){
布尔choicePosted=false;
试一试{
post();
}捕获(例外e){
e、 printStackTrace();
}
choicePosted=true;
返回所选内容;
}
公共静态无效帖子(){
Map choice=newhashmap();
选择.付诸表决(“问题编号”,“6”);
选择。把(“答案”、“15”);
String json=new GsonBuilder().create().toJson(choice,Map.class);
makeRequest(“http://localhost:3000/choices/“,json);
}
公共静态HttpResponse makeRequest(字符串uri、字符串json){
试一试{
HttpPost HttpPost=新的HttpPost(uri);
setEntity(新的StringEntity(json));
setHeader(“接受”、“应用程序/json”);
setHeader(“内容类型”、“应用程序/json”);
返回新的DefaultHttpClient().execute(httpPost);
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}

非常感谢您的帮助

代码的一个大问题是:

    } catch (Exception e) {
        e.printStackTrace();
    }
您正在吞咽所有异常,我猜您也在吞咽问题异常。您应该查看记录了什么异常的日志,并且不要使用catch(
exception e
),而是使用显式异常


没有实际的异常很难诊断,但我猜您是在UI线程内发出此http请求,Android框架明确禁止此请求(这会使您的应用程序无响应)并引发异常。

事实证明,我遇到的最大问题是我没有在帖子中发送CSRF令牌。包括
skip\u,然后再执行操作:验证\u真实性\u令牌
解决了我的问题。因为它是一个API,所以我准备了一些其他的安全验证,但是CSRF实际上只适用于web表单。

这是有道理的。关于我应该捕获哪种类型的异常有什么建议吗?Java将告诉您所有抛出的显式异常,因此您似乎正在捕获所需的一切。关于运行http请求UI的异常不应该被捕获,因为它永远不应该被执行,并且它旨在为您提供修复代码的信息。