使用 Android 客户端向 Ruby on rails 构建的 Web Application 提交 HTTP GET 和 HTTP POST 请求

最近想弄个能访问 Internet 的 Android 应用,因为求快所以用了 Ruby on Rails 来提供 HTTP
资源。这方面的资料还是比较少的,所以把尝试的过程记录下来。

1 使用 Ruby on Rails 构建 Web Application

1.1 新建 Web Application


rails new Test 
cd Test

1.2 生成 product


rails generate scaffold product reference:string quantity:decimal
rake db:migrate

启动服务


rails server

打开http://localhost:3000/products

应该可以看到以下信息(这个就是GET的结果啦,只不过现在还没有记录):

在网页上添加一条记录,单击“New Product”,会转到“http://localhost:3000/products/new”,在里面填写信息后单击“Greate Product”(这样就提交了一个
POST):

也就是说,网页端的 GET 和 POST 都是可以执行的。

1.3 使用 Json 格式传输数据


先试试 GET Json 格式的数据


打开:http://localhost:3000/products/1.json

可以看到,使用 ruby on rails 是可以直接获得 Json 数据的,这是为什么呢?

为了弄清楚 Json 数据是怎么来的,先查看 routes


rake routes

显示出以下结果:

所以输入的 http://localhost:3000/products/1.json 对应的是 Controller 里面的
show,在代码里找到show(Test/app/controllers/products_controller.rb):

咦!什么情况?啥都不写就能直接支持 Json ?这也太牛逼了吧。

再试试 Post Json 格式的数据


前面已经知道,用网页可以提交一个 POST,先跟踪一下下这个 POST,用开发者工具查看网络知道页面提交的时候提交了一个 POST:

这个 POST 根据前面的 Routes 应该是给了 controller 里的 create。

所以是 @product = Product.new(product_params) 创建对象,@product.save 保存对象。。那么
product_params 怎么来的呢?

好吧,是这样来的。。。

嗯。。还是没有解决我想要的 Json 传输方法,后来还是搜索找大神。。。

在 Test/app/controllers/products_controller.rb
中添加以下代码,用于接受 Android App 提交的 Json 数据。


  def create_from_app
data_json=JSON.parse request.body.read
@product = Product.new(data_json)
@product.save
end

1.4 测试 GET 和 POST 是否正常


测试使用的是火狐的 Poster 工具。

测试 GET

测试 POST

补上一段小插曲:直接提交 POST 时是出错的:

把出错的内容粘贴出来存成html,发现是这个错误:

百度求大神,得到这样的答案:

这是从rails 2.0
开始包含的一个新功能,目的在于防止CSRF(Cross-Site Request Forgery)攻击

有这样几种解决方式

请原谅我直接暴力地选择了禁用
CSRF 的方式,找到Test/app/controllers/products_controller.rb,插入代码


  protect_from_forgery :except => :index

# you can disable csrf protection on controller-by-controller basis:
skip_before_filter :verify_authenticity_token

重启 rails server

问题解决,再次提交 POST:

也就是说 Android 客户端只要能按照以上格式发送 HTTP 请求就可以了。

2 使用 Android 客户端访问 HTTP 资源

2.1 获取访问网络的权限


在 AndroidManifest.xml 文件中添加以下行


<uses-permission android:name="android.permission.INTERNET"/>

2.2 使用 Android 客户端提交 GET 请求


        try {
final String url = "http://192.168.0.138:3000/products/" + message
+ ".json";

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = new DefaultHttpClient()
.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(httpResponse
.getEntity());

}
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

2.3 使用 Android 客户端提交 POST 请求


try{
Thread threadPost = new Thread(new Runnable() {
@Override
public void run() {
try {
final String url = "http://192.168.0.138:3000/products";
HttpPost httpPost = new HttpPost(url);

JSONObject json = new JSONObject();
json.accumulate("reference", "888");
json.accumulate("quantity", "8");
JSONObject response = null;
StringEntity s = new StringEntity(json.toString());
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
httpPost.setEntity(s);

HttpResponse httpResponse = new DefaultHttpClient()
.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(httpResponse.getEntity());
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
threadPost.start();
threadPost.join();
} catch (Exception e) {
e.printStackTrace();
}

使用 Android 客户端向 Ruby on rails 构建的 Web Application 提交 HTTP GET 和
HTTP POST 请求,布布扣,bubuko.com

使用 Android 客户端向 Ruby on rails 构建的 Web Application 提交 HTTP GET 和
HTTP POST 请求

时间: 2024-11-08 19:01:54

使用 Android 客户端向 Ruby on rails 构建的 Web Application 提交 HTTP GET 和 HTTP POST 请求的相关文章

用 Ubuntu 12.04 搭建一个 Ruby on Rails 本地开发环境

转载,原文链接 http://linux.cn/portal.php?mod=view&aid=170 用 Ubuntu 搭建一个 Ruby on Rails 本地开发环境 想要开发 Ruby on Rails 应用吗?虽然已经有一些(初级的)Ruby on Rails 教程了,但是似乎在如何搭建一个简洁而更新的本地开发环境方面还有些不甚确定的地方. 这个教程将引导你通过几个步骤来搭建一个基于 Ubuntu 的 Ruby on Rails 本地开发环境.而这个教程的即将发布的第二部分,将帮助你搭

ruby on rails nginx 如何上传大文件?

用ruby on rails开发的web,用了carrierwave和dropzone实现了上传文件.但后来发现,一旦文件大于200M时,就不行了,特别慢,虽说carrierwave有个move_to_cache.move_to_store的选项,但好像起不了作用.于是又去研究其它的上传方式,之后发现nginx的upload module比较靠普,但这样做有一个问题就是nginx必须是编译安装的,要把upload module一块编译进行才能用.在这里记录一下实现的具体流程. 一.编译安装ngi

Android—构建安全的Android客户端请求,避免非法请求

今天通过实例来介绍一下如何构建安全的Android客户端请求,避免非法请求: [0分下载Demo]

[Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(PaaS开发平台),也就是Rails教程中介绍的Cloud 9平台,该平台已经自动为我们作好了环境配置的工作:只要你有一个浏览器就可以使用该云端开发环境.非常的方便快捷!简直赞!平台网址如下:https://c9.io/ Cloud 9开发平台的实质是为每一个注册的开发者在服务器端分配一个Linux虚拟机

Ruby on Rails开发Web应用的基本概念

Web应用架构 C/S架构 Web应用从最初就採用C/S架构.Server负责监听client请求,提供资源,Client向server发起请求并渲染页面.两者通过TCP/IP协议栈之上的HTTP协议通信. 多层架构 在Web 2.0时代,随着交互性的要求,这个架构变得更为复杂.Server须要提供更复杂的服务,Client也要完毕很多其它的交互任务,涌现出非常多新的提供更快更好服务的技术.对应的,C/S架构须要以一种更复杂的方式来组织,即多层架构. 多层架构中的每一层负责提供一个特定的功能,与

android客户端把SD卡文件上传到服务器端并保存在PC硬盘文件夹中

在局域网内,实现从android客户端把手机SD卡上的文件上传到PC服务器端,并保存在PC硬盘的指定文件夹下.同时把PC端硬盘文件的目录和对文件的描述信息保存在mysql数据库中. 1.客户端关键代码: (1)获得SD卡上的文件 /** * 获得文件路径和状态信息 * * @return */ private String getFiles() { File path = null; // 判断SD卡是否存在可用 if (Environment.getExternalStorageState()

CentOS安装Ruby on Rails + Redmine

安装准备组件 gcc编译环境: yum -y install gcc 其他组件: yum install flex autoconf zlib curl zlib-devel curl-devel bzip2  bzip2-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel gcc+ gcc-c++ libxml2 libxml2-devel libxslt libxslt-d

Ruby On Rails中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Ruby On Rails调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它

android客户端与服务端交互的三种方式

android客户端向服务器通信一般有以下选择: 1.传统的java.net.HttpURLConnection类 2.apache的httpClient框架(已纳入android.jar中,可直接使用) 3.github上的开源框架async-http(基于httpClient) ---------------------------------------------------------------------------------- 下面分别记录这三种方式的使用, 传统方式: /**