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