Android学习笔记46:使用Post方式提交数据

Android 使用Post方式提交数据 阅读详情
From:http://www.cnblogs.com/menlsh/archive/2013/05/22/3091983.html

  在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。

  在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。POST与GET的不同之处在于POST的参数不是放在URL字符串里面,而是放在HTTP请求数据中。

  本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并将服务器的响应结果显示在Android客户端。

 

1.服务器端的准备

  为了完成该实例,我们需要在服务器端做以下准备工作:

  (1)我们需要在MyEclipse中创建一个Web工程,用来模拟服务器端的Web服务,这里,我将该工程命名为了“myhttp”。

  (2)修改该工程的“index.jsp”文件,添加两个输入框和一个提交按钮,作为该Web工程的显示页面。运行Tomcat,在浏览器中访问该Web工程,可以看到如图1所示的界面。

图1 Web工程的显示页面

  (3)在该Web工程中,创建一个继承自HttpServlet的LoginAction类,并实现其中的doPost()方法,用来响应图1所示页面的用户操作。具体实现如下:

复制代码
 1   public void doPost(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3 
 4         response.setContentType("text/html;charset=utf-8");
 5         request.setCharacterEncoding("utf-8");
 6         response.setCharacterEncoding("utf-8");
 7         PrintWriter out = response.getWriter();
 8         
 9         String username = request.getParameter("username");
10         String password = request.getParameter("password");
11                 
12         //判断用户名密码是否正确
13         if(username.equals("admin") && password.equals("123")) {
14             out.print("Login succeeded!");
15         }else {
16             out.print("Login failed!");
17         }
18         
19         out.flush();
20         out.close();
21     }
复制代码

  由上述代码可以看出,当我们在图1所示的页面输入用户名“admin”,密码“123”时,点击提交按钮,会得到“Login succeeded!”的提示信息,如图2所示。若用户名、密码错误,则会得到“Login failed!”的提示信息。

图2 登录成功界面

  至此,服务器端的准备工作就全部完成了。

 

2.客户端实现

  在Android客户端,我们需要完成的工作是:以POST方式发送用户名密码到上述服务器,并获得服务器的验证信息。

  我们分以下几个步骤来完成。

2.1 UI界面

  在Android工程中,我们需要完成一个简单的UI界面,用来完成用户名密码的输入、发送POST请求、显示服务器的验证结果,完成后的界面如图3所示。

图3 客户端UI界面

  在MainActivity中,我们需要获取两个EditText控件的输入,“提交”按键的监听,以及服务器验证结果的TextView内容显示。具体实现代码如下:

复制代码
 1     /*
 2      * Function  :   点击事件响应
 3      * Author    :   博客园-依旧淡然
 4      */
 5     public void onClick(View view) {
 6         switch(view.getId()) {
 7         case R.id.button_submit:
 8             String username = mEditText_userName.getText().toString();
 9             String password = mEditText_password.getText().toString();
10             Map<String, String> params = new HashMap<String, String>();
11             params.put("username", username);
12             params.put("password", password);
13             mTextView_result.setText(HttpUtils.submitPostData(params, "utf-8"));
14             break;
15         }
16     }
复制代码

2.2发送POST请求到服务器

  可以看到上述代码中,我们调用了HttpUtils类的静态方法submitPostData()完成了发送POST请求到服务器,并将该方法的返回值(服务器的响应结果)显示在了TextView控件中。

  在HttpUtils类中,submitPostData()方法的具体实现如下:

复制代码
/*
     * Function  :   发送Post请求到服务器
     * Param     :   params请求体内容,encode编码格式
     * Author    :   博客园-依旧淡然
     */
    public static String submitPostData(Map<String, String> params, String encode) {
        
        byte[] data = getRequestData(params, encode).toString().getBytes();    //获得请求体
        try {            
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setConnectTimeout(3000);          //设置连接超时时间
            httpURLConnection.setDoInput(true);                  //打开输入流,以便从服务器获取数据
            httpURLConnection.setDoOutput(true);                 //打开输出流,以便向服务器提交数据
            httpURLConnection.setRequestMethod("POST");        //设置以Post方式提交数据
            httpURLConnection.setUseCaches(false);               //使用Post方式不能使用缓存
            //设置请求体的类型是文本类型
            httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //设置请求体的长度
            httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length));
            //获得输出流,向服务器写入数据
            OutputStream outputStream = httpURLConnection.getOutputStream();
            outputStream.write(data);
            
            int response = httpURLConnection.getResponseCode();            //获得服务器的响应码
            if(response == HttpURLConnection.HTTP_OK) {
                InputStream inptStream = httpURLConnection.getInputStream();
                return dealResponseResult(inptStream);                     //处理服务器的响应结果
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
复制代码

  通过以上的代码可以看出,在该方法中,其实完成了3件事:

  (1)将用户名密码封装成请求体,这是通过调用getRequestData()方法来实现的(后面会讲到这个方法的具体实现)。

  (2)设置HttpURLConnection对象的各种参数(其实是设置HTTP协议请求体的各项参数),然后通过httpURLConnection.getOutputStream()方法获得服务器输出流outputStream,再使用outputStream.write()方法将请求体内容发送给服务器。

  (3)判断服务器的响应码,通过httpURLConnection.getInputStream()方法获得服务器的响应输入流,然后再调用dealResponseResult()方法处理服务器的响应结果。

2.3封装请求体

  使用POST请求时,POST的参数不是放在URL字符串里,而是放在HTTP请求数据中,所以我们需要对POST的参数进行封装。

  针对该实例而言,我们发送的URL请求是:http://192.168.1.101:8080/myhttp/servlet/LoginAction,但是我们需要将POST的参数(也就是username和password)封装到该请求中,形成如下的形式:http://192.168.1.101:8080/myhttp/servlet/LoginAction?username=admin&password=123。我们该怎么做呢?如下的代码给出了一种实现的方案:

复制代码
 1     /*
 2      * Function  :   封装请求体信息
 3      * Param     :   params请求体内容,encode编码格式
 4      * Author    :   博客园-依旧淡然
 5      */
 6     public static StringBuffer getRequestData(Map<String, String> params, String encode) {
 7         StringBuffer stringBuffer = new StringBuffer();        //存储封装好的请求体信息
 8         try {
 9             for(Map.Entry<String, String> entry : params.entrySet()) {
10                 stringBuffer.append(entry.getKey())
11                             .append("=")
12                             .append(URLEncoder.encode(entry.getValue(), encode))
13                             .append("&");
14             }
15             stringBuffer.deleteCharAt(stringBuffer.length() - 1);    //删除最后的一个"&"
16         } catch (Exception e) {
17             e.printStackTrace();
18         }
19         return stringBuffer;
20     }
复制代码

2.4处理响应结果

  最后,我们再来看一看对服务器返回结果的处理是怎样的。因为在本实例中,服务器的返回结果是字符串“Login succeeded!”或“Login failed!”,所以这里我们需要做的就是将服务器的返回结果输入流转化成字符串。当然了,如果服务器返回的是图片,那么,我们就需要就得到的输入流转化成Bitmap图片了。如下代码是上面代码中用到的dealResponseResult()方法的具体实现。

复制代码
 1     /*
 2      * Function  :   处理服务器的响应结果(将输入流转化成字符串)
 3      * Param     :   inputStream服务器的响应输入流
 4      * Author    :   博客园-依旧淡然
 5      */
 6     public static String dealResponseResult(InputStream inputStream) {
 7         String resultData = null;      //存储处理结果
 8         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 9         byte[] data = new byte[1024];
10         int len = 0;
11         try {
12             while((len = inputStream.read(data)) != -1) {
13                 byteArrayOutputStream.write(data, 0, len);
14             }
15         } catch (IOException e) {
16             e.printStackTrace();
17         }
18         resultData = new String(byteArrayOutputStream.toByteArray());    
19         return resultData;
20     }
复制代码

2.5运行效果

  最后,看看该实例的运行效果吧,如图4所示。

图4 实例运行效果

COCOS 3.8 接入高德定位SDK /微信登录所必须的code。//是否获得code。 阅读详情

相关推荐

飞书多维表格省钱攻略:1个专业版账号,全员合规用、权限全掌控

像运动馆、 托管班、作业辅导、少儿美术、书法、口才班等等。对于大多数中小团队而言,飞书多维表格的核心需求是“协作高效、数据可控、成本可控”,而“1个专业版账号+多联系人”的模式,恰好完美契合这三点——既不用为不必要的席位付费,又能解锁全部专业功能,还能通过精细化权限管控保障数据安全。尤其是餐饮店、乒乓球训练馆这类个体经营或小型团队,人员分工清晰、权限需求明确,采用这种模式能最大化节省成本,同时提升管理效率。无需复杂的配置,无需额外的技术支持,5分钟就能搭建起全员协作的省钱体系。

涛涛讲AI 2235

安卓发送post请求

在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并将服务器的响应结果显示在Android客户端。在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。将提交的数据写入Log\Log.php文件中。

weixin_67271870的博客 1940

Pinocchio 结合 CasADi 进行 IK 逆运动学及 Mujoco 仿真

摘要:本视频演示了如何利用Pinocchio和CasADi实现机械臂逆运动学(IK)求解,并在Mujoco中进行仿真。通过构建优化问题(最小化位姿误差),结合IPOPT求解器对机械臂关节角度进行优化。代码支持导入URDF/MJCF模型,并以so100机械臂为例,实现了末端执行器位置跟踪的仿真测试。关键步骤包括:建立平移/旋转误差函数、设置约束条件、调用CasADi求解,最终在Mujoco中实时更新关节状态完成运动控制。

darcsdn 1004

android post方法吗,Android中使用Post请求的方法

本文实例讲述了Android中使用Post请求的方法。分享给大家供大家参考。具体如下:一、需要用到的场景在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中有时也要从服务器获取一些数据,就也必须得使用post请求了。二、需要用到的主要类在android中使用post请求主要要用到的类是HttpPost、HttpResponse、EntityUtils三、主要...

weixin_35953401的博客 2227

soul聊天协议逆向

通过观察上面的CFG发现,该混淆符合以下逻辑,整体思路就是先查找主分发器,一般被引用次数最多的那个块就是主分发器,引用主分发器的块大概率是真实块,再使用unicorn模拟执行,遍历每一个分支,记录每一个块,如果某一个块是上次记录的块则也为真实块,无后继的块则为retn块,剩下的就是无用块。通过Frida Hook libc.so后发现,聊天协议走的是JAVA层的socket,然后Hook JAVA层相关函数得到如下调用堆栈。里面调用的函数不是很多,所以。不行不行,革命要彻底!

2503_90751789的博客 3218

【OCPP】ocpp1.6J协议框架说明

本文档的目的是为读者提供创建正确的可互操作 OCPP JSON 实现 (OCPP-J) 所需的信息。我们将根据我们自己的经验,尝试解释什么是强制性的、什么是良好做法以及什么是不应该做的。毫无疑问,误解或歧义仍然存在,但我们旨在通过本文件尽可能地防止它们。IANA:互联网数字分配机构(OCPP-J:使用JSON通过WebSocket进行OCPP通信。特定的OCPP版本应使用J扩展进行指示。OCPP1.5J表示我们正在讨论1.5版本的JSON/WebSocket实现。

qq_53871375的博客 1242

Android中使用Post请求

一、需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中有时也要从服务器获取一些数据,就也必须得使用post请求了。   二、需要用到的主要类 在android中使用post请求主要要用到的类是HttpPost、HttpResponse、EntityUtils   三、主要思路 1、创建HttpPost实例,设置需要请求服务器的

tianyitianyi1的专栏 8万+

12、信号采样与Z变换的全面解析

本文全面解析了信号采样和Z变换的核心概念与应用。内容涵盖采样基础、采样频率与奈奎斯特率的关系、离散时间处理模拟信号的方法、采样率转换技术,以及Z变换的定义、性质、常见变换对和逆变换计算。通过实例分析和流程图展示,帮助读者深入理解数字信号处理的关键步骤,为相关领域的学习与应用打下坚实基础。

Jerry的专栏 120

Android学习笔记46-使用Post方式提交数据

在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。   在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。POST与GET的不同之处在于POST的参数不是放在URL字符串里面,而是放在HTTP请求数据中。   本文...

weixin_34361881的博客 83

在 SAP S/4HANA 的 BP 事务里做保存前校验:BDT 事件、BUPA_FURTHER_CHECKS 与 CVI 扩展 BAdI 一次讲透

SAP BP事务保存前校验机制解析 摘要:本文系统梳理了SAP BP事务保存前的校验机制,揭示了三种关键校验点的差异与适用场景: BDT框架DCHCK事件:最靠近UI层,适合屏幕字段级校验,但API调用时可能失效 Classic BAdI BUPA_FURTHER_CHECKS:全局拦截点,可阻断整个BP保存,适合核心业务规则 CVI扩展校验:仅管控供应商/客户段落,需注意可能产生"BP已保存但段落未保存"的情况 文章通过真实案例(如黑名单校验、付款冻结等)展示了各校验点的最佳实践,并特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 312

Android实现自动输入文本效果 (附完整源码)

Android实现自动输入文本效果 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 416

android post方式上传文件(模拟表单格式数据提交)

表单提交内容为: POST /upload.php?zp_id=ab46ca6d703e3a1580c1c9b8b3a8fb39 HTTP/1.1Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application...

669

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android学习笔记8:使用HttpClient接口实现网络通信

在Android中,我们可以通过使用标准的Java接口来完成Android应用程序的联网操作。但是在实际开发中,可能会需要用到更复杂的联网操作,为此,Android平台提供了ApacheHttpClient接口,为客户端的HTTP编程提供了高效、便捷、功能丰富的工具包支持。   Android平台在引入ApacheHttpClient的同时,还对其进行了一些封装和扩展,如设置缺省的...

dianlv7051的博客 249

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android客户端提交的数据怎么插入到远程服务器数据库

Android网络编程之传递数据给服务器(二)   请尊重他人的劳动成果,转载请注明出处:Android网络编程之传递数据给服务器(二) 我曾在《Android网络编程之传递数据给服务器(一) 》 一文中介绍了如何通过GET方式传递数据给服务器,通过GET方式传递数据主要适用于数据大小不超过2KB,且对安全性要求不高的情况下。下面就介绍通过POST方式传递数据主到服务器。   一、通过P

qq_30673255的博客 1542

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android提交数据到服务器的两种方式四种方法

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法。 代码比较简单,这里不去过多的阐述,直接看代码。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14

zjy_hll的专栏 446

Android使用HttpURLConnection通过POST方式发送java序列化对象

使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互。 Android端代码: 1 public String SendDataByPost(String urlStr){ 2 URL url = null; 3 String...

ailiannve0543的博客 198

post方式请求数据

post方式请求数据   分析: 1、将请求方式改成post   conn.setRequestMethod("POST");   2、设置连接可以输出   conn.setDoOutput(true); 3、告诉服务器客户端提交的数据类型(表单数据)   conn.setRequestProperty("Content-Type","application/x-www-for...

weixin_34088838的博客 263

Android(java)学习笔记156:开源框架post和get方式提交数据(qq登录案例)

1. 前面提到Http的get/post方式 、 HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2. Android应用会经常使用http协议进行传输,网上会有很完善开源框架,已经包装好了http的get/post,还有httpclient等等;这样我们开发周期也会缩短; 3. 下面通过一个Android案例来进行,说明常用的Http框架: 在http...

weixin_30404405的博客 87

Android学习笔记47:使用HttpClient接口实现网络通信

  在Android中,我们可以通过使用标准的Java接口来完成Android应用程序的联网操作。但是在实际开发中,可能会需要用到更复杂的联网操作,为此,Android平台提供了ApacheHttpClient接口,为客户端的HTTP编程提供了高效、便捷、功能丰富的工具包支持。   Android平台在引入ApacheHttpClient的同时,还对其进行了一些封装和扩展,如设置缺...

weixin_30687811的博客 229

[安卓] 14、安卓HTTP——POST和GET用法分析

内容简介 本文通过建立一个简单的Servlet服务器来分析安卓上用HTTP和服务器通信的细节,旨在演示C/S模式下服务器端和客户端的工作过程。 目录 part.1 用MyEclipse建立一个简单的servlet服务器 part.2 安卓HTTP的POST和GET请求方法 part.3 本例中C/S双方工作机制分析 part.4 拓展知识 ...

weixin_34377065的博客 145

使用异步httpclient框架做get,post提交数据

1.将异步httpclient框架导入 下载地址:http://download.youkuaiyun.com/detail/sinat_32804317/9555641 2.代码实现 1 public class MainActivity extends Activity { 2 3 @Override 4 protected void onCreate(...

weixin_30371875的博客 98
上一篇: Android学习地址之一
下一篇: 分享几个Android开发有用的程序代码
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值