Android学习之Http使用Post方式进行数据提交

转自:http://blog.csdn.net/wulianghuan/article/details/8626551

我们知道通过Get方式提交的数据是作为Url地址的一部分进行提交,而且对字节数的长度也有限制,与Get方式类似,http-post参数也是被URL编码的,然而它的变量名和变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。

可以通过如下的代码设置POST提交方式参数:

[html] view plaincopyprint?

  1. HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
  2. urlConnection.setConnectTimeout(3000);
  3. urlConnection.setRequestMethod("POST"); //以post请求方式提交
  4. urlConnection.setDoInput(true);     //读取数据
  5. urlConnection.setDoOutput(true);    //向服务器写数据
  6. //获取上传信息的大小和长度
  7. byte[] myData = stringBuilder.toString().getBytes();
  8. //设置请求体的类型是文本类型,表示当前提交的是文本数据
  9. urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  10. urlConnection.setRequestProperty("Content-Length", String.valueOf(myData.length));

这里使用一个案例来看一下如何使用post方式提交数据到服务器:

首先我们创建一个java project,只要创建一个类就行,我们创建一个HttpUtils.java类,

【代码如下】:

[html] view plaincopyprint?

  1. package com.wujay.utils;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.io.UnsupportedEncodingException;
  7. import java.net.HttpURLConnection;
  8. import java.net.MalformedURLException;
  9. import java.net.URL;
  10. import java.net.URLEncoder;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. public class HttpUtils {
  14. private static String PATH = "http://bdfngdg:8080/myhttp/servlet/LoginAction"; // 服务端地址
  15. private static URL url;
  16. public HttpUtils() {
  17. super();
  18. }
  19. // 静态代码块实例化url
  20. static {
  21. try {
  22. url = new URL(PATH);
  23. } catch (MalformedURLException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. /**
  28. * 发送消息体到服务端
  29. *
  30. * @param params
  31. * @param encode
  32. * @return
  33. */
  34. public static String sendPostMessage(Map<String, String> params,
  35. String encode) {
  36. StringBuilder stringBuilder = new StringBuilder();
  37. if (params != null && !params.isEmpty()) {
  38. for (Map.Entry<String, String> entry : params.entrySet()) {
  39. try {
  40. stringBuilder
  41. .append(entry.getKey())
  42. .append("=")
  43. .append(URLEncoder.encode(entry.getValue(), encode))
  44. .append("&");
  45. } catch (UnsupportedEncodingException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. stringBuilder.deleteCharAt(stringBuilder.length() - 1);
  50. try {
  51. HttpURLConnection urlConnection = (HttpURLConnection) url
  52. .openConnection();
  53. urlConnection.setConnectTimeout(3000);
  54. urlConnection.setRequestMethod("POST"); // 以post请求方式提交
  55. urlConnection.setDoInput(true); // 读取数据
  56. urlConnection.setDoOutput(true); // 向服务器写数据
  57. // 获取上传信息的大小和长度
  58. byte[] myData = stringBuilder.toString().getBytes();
  59. // 设置请求体的类型是文本类型,表示当前提交的是文本数据
  60. urlConnection.setRequestProperty("Content-Type",
  61. "application/x-www-form-urlencoded");
  62. urlConnection.setRequestProperty("Content-Length",
  63. String.valueOf(myData.length));
  64. // 获得输出流,向服务器输出内容
  65. OutputStream outputStream = urlConnection.getOutputStream();
  66. // 写入数据
  67. outputStream.write(myData, 0, myData.length);
  68. outputStream.close();
  69. // 获得服务器响应结果和状态码
  70. int responseCode = urlConnection.getResponseCode();
  71. if (responseCode == 200) {
  72. // 取回响应的结果
  73. return changeInputStream(urlConnection.getInputStream(),
  74. encode);
  75. }
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. return "";
  81. }
  82. /**
  83. * 将一个输入流转换成指定编码的字符串
  84. *
  85. * @param inputStream
  86. * @param encode
  87. * @return
  88. */
  89. private static String changeInputStream(InputStream inputStream,
  90. String encode) {
  91. // 内存流
  92. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  93. byte[] data = new byte[1024];
  94. int len = 0;
  95. String result = null;
  96. if (inputStream != null) {
  97. try {
  98. while ((len = inputStream.read(data)) != -1) {
  99. byteArrayOutputStream.write(data, 0, len);
  100. }
  101. result = new String(byteArrayOutputStream.toByteArray(), encode);
  102. } catch (IOException e) {
  103. e.printStackTrace();
  104. }
  105. }
  106. return result;
  107. }
  108. /**
  109. * @param args
  110. */
  111. public static void main(String[] args) {
  112. Map<String, String> map = new HashMap<String, String>();
  113. map.put("username", "admin");
  114. map.put("password", "123456");
  115. String result = sendPostMessage(map, "UTF-8");
  116. System.out.println(">>>" + result);
  117. }
  118. }

我们再创建一个服务端工程,一个web project,这里创建一个myhttp的工程,先给它创建一个servlet,用来接收参数访问。

创建的servlet配置如下:

[html] view plaincopyprint?

  1. <servlet>
  2. <description>This is the description of my J2EE component</description>
  3. <display-name>This is the display name of my J2EE component</display-name>
  4. <servlet-name>LoginAction</servlet-name>
  5. <servlet-class>com.login.manager.LoginAction</servlet-class>
  6. </servlet>
  7. <servlet-mapping>
  8. <servlet-name>LoginAction</servlet-name>
  9. <url-pattern>/servlet/LoginAction</url-pattern>
  10. </servlet-mapping>

建立的LoginAction.java类继承HttpServlet:

[html] view plaincopyprint?

  1. package com.login.manager;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class LoginAction extends HttpServlet {
  9. /**
  10. * Constructor of the object.
  11. */
  12. public LoginAction() {
  13. super();
  14. }
  15. /**
  16. * Destruction of the servlet. <br>
  17. */
  18. public void destroy() {
  19. super.destroy(); // Just puts "destroy" string in log
  20. // Put your code here
  21. }
  22. /**
  23. * The doGet method of the servlet. <br>
  24. *
  25. * This method is called when a form has its tag value method equals to get.
  26. *
  27. * @param request the request send by the client to the server
  28. * @param response the response send by the server to the client
  29. * @throws ServletException if an error occurred
  30. * @throws IOException if an error occurred
  31. */
  32. public void doGet(HttpServletRequest request, HttpServletResponse response)
  33. throws ServletException, IOException {
  34. this.doPost(request, response);
  35. }
  36. /**
  37. * The doPost method of the servlet. <br>
  38. *
  39. * This method is called when a form has its tag value method equals to post.
  40. *
  41. * @param request the request send by the client to the server
  42. * @param response the response send by the server to the client
  43. * @throws ServletException if an error occurred
  44. * @throws IOException if an error occurred
  45. */
  46. public void doPost(HttpServletRequest request, HttpServletResponse response)
  47. throws ServletException, IOException {
  48. response.setContentType("text/html;charset=utf-8");
  49. request.setCharacterEncoding("utf-8");
  50. response.setCharacterEncoding("utf-8");
  51. PrintWriter out = response.getWriter();
  52. String userName = request.getParameter("username");
  53. String passWord = request.getParameter("password");
  54. System.out.println("userName:"+userName);
  55. System.out.println("passWord:"+passWord);
  56. if(userName.equals("admin") && passWord.equals("123456")){
  57. out.print("login successful!");
  58. }else{
  59. out.print("login failed");
  60. }
  61. out.flush();
  62. out.close();
  63. }
  64. /**
  65. * Initialization of the servlet. <br>
  66. *
  67. * @throws ServletException if an error occurs
  68. */
  69. public void init() throws ServletException {
  70. // Put your code here
  71. }
  72. }

我们运行java project,控制台输出如下:

>>>login successful!

时间: 2024-10-23 20:46:14

Android学习之Http使用Post方式进行数据提交的相关文章

android学习二十三(解析json格式数据)

前面我们已经掌握了xml格式数据的解析方式,那么接下来我们学习下如何解析json格式的数据.比起xml,json的主要优势在于它体积更小,在网络上传输的时候可以更省流量.但缺点在于,它的语义性差,看起来不如xml直观. 开始之前,先在自己的电脑apache-tomcat-6.0.39\webapps\ROOT路径目录下新建一个get_data.json的文件,然后编辑这个文件,并加入如下json格式的内容: [{"id":"5","version"

Android学习之Service(1)---&gt;Started方式

界面退出后进程程序还在运行,不会被杀死,如音乐播发器.后台下载等 注:本文只讨论Started方式 main.xml代码分析 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

我有一壶酒 Android学习之Service(1)---&gt;BinderService方式

本文只讨论扩展Binder类 创建一个Binder.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_p

Android学习之 Manifest中meta-data扩展元素数据的配置与获取

在AndroidManifest.xml清单文件中 我们有时会看到如下类似的<meta-data ... >元素开始的配置内容: <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyBhBFOgVQclaa8p1JJeqaZHiCo2nfiyBBo" /> <meta-data android:name="com.g

Android学习小记-----监听并保存传感器数据,让service后台运行(保持CPU运转

最近做了一个Demo,监听手机中传感器的数据,并将数据保存到手机文件中,发现数据会有丢失的现象. 经过多次测试,发现系统进入深度休眠了,之后service会停止,虽然增加了service自动启动的功能,但是还会导致数据中断一段时间.如果屏幕一直亮着会比较耗电,所以亮屏这种方法直接Pass掉.那么怎么保证service一直运行不会中断呢? 1,PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过Con

Android学习系列之(五)Activity之间的数据传递

前言:前面我们已经掌握了 Activity 的基本使用,但是那都是在同一个 Activity 中进行操作的.那么若我们要在不同 Activity 之间进行数据交互,这又如何实现?那现在我们依旧以模拟登录注册这一个例子来进行说明 一.需求说明: 模拟用户的登录注册行为,用户注册信息后,将注册时的账号.密码这一数据传递到登陆界面. 二.代码实现: 1.布局文件代码: activity_main.xml: <?xml version="1.0" encoding="utf-8

UDP学习3(通过键盘录入方式发送数据demo)

1 import java.net.*; 2 import java.io.*; 3 class UDPSDemo 4 { 5 public static void main(String[]args) throws Exception 6 { 7 //创建发送端socket服务 8 DatagramSocket ds=new DatagramSocket(); 9 //准备发送的数据包 10 BufferedReader br=new BufferedReader(new InputStrea

学习Java 采取令牌的方式避免重复提交

重复提交原因 从提交页面到成功页面的跳转一般采用视图定位,由于视图定位是在服务端跳转的,如果用户在点击提交之后再次刷新页面,会导致重复提交,数据库的数据会有重复. 采用令牌措施 1.在转账展示页面生成一个随机的令牌号码,然后放入session和传参中. @RequestMapping("/toTrans")// public String toTrans(ModelMap modelMap, HttpSession session ) {//! // //如果是转账,则先查询余额 St

十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象传入即可.但是在Activity中不能传递监听对象,所以考虑使用广播来实现. public void login(final LoginOnClickListener listener) { Intent intent = new Intent(context, LoginActivity.clas