【问题标题】:In ruby on rails how to get data from client side(android)在 ruby​​ on rails 如何从客户端获取数据(android)
【发布时间】:2013-06-10 19:50:24
【问题描述】:

Android 作为客户端,我将数据从客户端发送到服务器端。Ruby on rails 作为服务器端,如何使用 post 方法从客户端获取数据。

我想从客户端获取数据到服务器端进行显示。 对于客户端,我有代码如何向服务器端发送数据,但在服务器端我不知道如何获取数据。

通过仅使用服务器端,我们必须创建 url,并且我们必须在客户端代码中使用该 url 来发送数据。

服务器端代码。

def load
    if signed_in?
      @my_posts = current_user.posts.paginate(page: params[:page],:per_page => 10)
      @my_post = current_user.posts.new
    end
    @posts = Post.paginate(page: params[:page],:per_page => 10)
    @post = Post.new
  end


  def index
    @posts = Post.all
    respond_with(@posts) do |format|
      format.json { render json: @post_names = {:post => @posts.as_json(:only=> :content)} }
    end
  end 

  def show
    if signed_in?
      @post = Post.find(params[:id])
      @my_posts = current_user.posts.paginate(page: params[:page],:per_page => 10)
      current_user.vote_for(@post)
    else
    @post = Post.find(params[:id])
    Guest.find(1).vote_for(@post)
    end
    @posts = Post.paginate(page: params[:page],:per_page => 10)  
    @guest = Guest.new
    @user = User.new
    @users = User.paginate(page: params[:page],:per_page => 10)
  end

  def create 
    @post = Post.new(params[:post])
    if @post.save
      @posts = Post.paginate(page: params[:page],:per_page => 10)
    else 
      @posts = Post.paginate(page: params[:page],:per_page => 10)
    end
    @guest = Guest.new
    @users = User.paginate(page: params[:page],:per_page => 10)

  end

  def my_prayer_create     
      @my_post = current_user.posts.new(params[:post])
      @post = Post.new(params[:post])
      @guest = Guest.new
      @user = User.new
      @users = User.paginate(page: params[:page],:per_page => 10)
      if @my_post.save
        flash[:notice] = "Prayer Successfully created."
        @my_posts = current_user.posts.paginate(page: params[:page],:per_page => 10)
      else 
        flash[:notice] = "Error"
        @my_posts = current_user.posts.paginate(page: params[:page],:per_page => 10)
      end
  end

  def edit
    if signed_in?    
    @my_post = current_user.posts.find(params[:id])
    else
    @post = Post.find(params[:id])
    end
  end

  def update
    if signed_in? 
      @my_post = current_user.posts.find(params[:id])
      if @my_post.update_attributes(params[:post])
        flash[:notice] = "Prayer Successfully updated."
        @my_posts = current_user.posts.paginate(page: params[:page],:per_page => 10)
      end
    else  
    @post = Post.find(params[:id])
    end
  end

  def destroy
    if signed_in? 
      @my_post = current_user.posts.find(params[:id])
      @users = User.paginate(page: params[:page],:per_page => 10)
      @guest = Guest.new
      @my_post.destroy
      flash[:notice] = "Prayer Successfully destroyed."
      @my_posts = current_user.posts.paginate(page: params[:page],:per_page => 10)
    end
  end

这是服务器端,如何从客户端获取数据。

我在这里也提到了我的客户端代码

public class HomeLayoutActivity extends Activity implements OnClickListener{

        private EditText value;
        private Button btn;
        private ProgressBar pb;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home_layout);
            value=(EditText)findViewById(R.id.editText1);
            btn=(Button)findViewById(R.id.button1);
            pb=(ProgressBar)findViewById(R.id.progressBar1);
            pb.setVisibility(View.GONE);
            btn.setOnClickListener(this);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.home_layout, menu);
            return true;
        }

        public void onClick(View v) {
            // TODO Auto-generated method stub
                if(value.getText().toString().length()<1){

                    // out of range
                    Toast.makeText(this, "please enter something", Toast.LENGTH_LONG).show();
                }else{
                    pb.setVisibility(View.VISIBLE);
                    new MyAsyncTask().execute(value.getText().toString());      
                }


        } 

        private class MyAsyncTask extends AsyncTask<String, Integer, Double>{

            @Override
            protected Double doInBackground(String... params) {
                // TODO Auto-generated method stub
                postData(params[0]);
                return null;
            }

            protected void onPostExecute(Double result){
                pb.setVisibility(View.GONE);
                Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show();
            }
            protected void onProgressUpdate(Integer... progress){
                pb.setProgress(progress[0]);
            }

            public void postData(String valueIWantToSend) {
                // Create a new HttpClient and Post Header
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://localhost:3000/posts/create_a_post");

                try {
                    // Add your data
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("content", valueIWantToSend));
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    //httppost.addHeader("Authorization","Basic "+authorization);
                    httppost.addHeader("Content-Type","application/x-www-form-urlencoded");
                    //httppost.setHeader("Content-Type", "application/json");
                    httppost.addHeader("Accept", "application/json");

                    // Execute HTTP Post Request
                    HttpResponse response = httpclient.execute(httppost);

                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                } catch (IOException e) {
                    // TODO Auto-generated catch block


                }
            }
        }
    }

如何从客户端获取数据,我必须在 ruby​​ on rails 中执行哪些代码

【问题讨论】:

  • 你向服务器发送什么样的数据,是纯文本还是Json? MyAsyncTask 是否负责向服务器发送数据?
  • @dan,我在这里也清楚地提到了我的客户端代码,我想发送一个 json 数据
  • @dan 我必须为 post 方法添加代码,因为只有我可以将 url 也提供给客户端代码
  • @dan,我正在发送任何 json,我只是发送文本文件,如何在 ruby​​ on rails 中获取该文本
  • 我想添加什么部分,我想在哪里添加以及我想给@dan的网址

标签: android ruby-on-rails ruby ruby-on-rails-3 post


【解决方案1】:

您不会将 Json 发送到服务器。

查看类似问题如何使用 Android 发送 Json 数据: How to send POST request in JSON using HTTPClient?

如果你的 Json 是正确的,你可以在 Rails 中使用params 方法访问你的数据,在普通的 web 请求和 android 客户端请求之间访问参数没有区别。

您无需更改 Rails 代码。使用 Http-Client 发出测试请求。

我为HttpRequester 的示例请求制作了屏幕截图:

参数 post[name] 和 post[user_id] 仅为示例,将其替换为您的属性。

您的开发服务器控制台在发送请求后应该有以下输出:

Started POST "/posts" for 127.0.0.1 at 2013-06-10 13:31:01 +0200
Processing by PostsController#create as HTML
  Parameters: {"post"=>{"name"=>"name", "user_id"=>"5"}}

【讨论】:

  • 对不起,我没有发送 json,我只是发送简单的文本,例如 nameValuePairs.add(new BasicNameValuePair("content", valueIWantToSend));
  • 你有一个客户端的链接,我在服务器端遇到问题 ror dude
  • 你的问题是你没有向服务器发送正确的数据,我给了你一个用android发送真实json数据的链接,但是如果你只想发送key-value-pairs你必须设置您在客户端的 Content-Type 为“application/x-www-form-urlencoded”。然后,您可以使用params 方法轻松访问客户端数据,正如我所提到的。
  • httppost.setHeader("Content-Type", "application/json");这是正确的,如何在服务器端设置,你能看看我的代码并告诉错误以及我想在我的代码中更改什么@dan
  • 设置httppost.setHeader("Content-Type", "application/x-www-form-urlencoded"),你不需要在服务器端做任何改变,你只需要发送正确的帖子数据,然后 rails 将完成剩下的工作
猜你喜欢
  • 2013-11-09
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多