Android 之http编程

HTTP-GET和HTTP-POST定义:

都是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。

每个HTTP-GET和HTTP-POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,

而响应则是由一系列HTTP请求数据和响应数据组成,如果请求成功则返回响应的数据。

Ø HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。

Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。

Ø与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。

GET和POST之间的主要区别:

1、GET是从服务器上获取数据,POST是向服务器传送数据。

2、在客户端, GET方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交

3、对于GET方式,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器端用Request.Form获取提交的数据。

4、GET方式提交的数据最多只能有1024字节,而POST则没有此限制

5、安全性问题。正如在(2)中提到,使用 GET 的时候,参数会显示在地址栏上,而 POST 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 GET ;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 POST为好

Java中进行HTTP编程有如下的两种方式:标准的Java接口和标准Apache接口

标准的Java接口 两个案例(GET和POST)

案例1:以Java接口GET方式从服务器获得一张图片下载到本地磁盘

首次得导入相关第三方的包

源码:

 1 package com.http.get;
 2
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.net.HttpURLConnection;
 7 import java.net.MalformedURLException;
 8 import java.net.URL;
 9
10 public class HttpUtils {
11
12     private static String urlPath="http://i6.topit.me/6/5d/45/1131907198420455d6o.jpg";
13     private static HttpURLConnection httpURLConnection=null;
14     public HttpUtils() {
15         // TODO Auto-generated constructor stub
16     }
17 public static InputStream getInputStream() throws IOException{
18     InputStream inputStream=null;
19     URL url=new URL(urlPath);
20     if(url!=null){
21         httpURLConnection=(HttpURLConnection)url.openConnection();
22         httpURLConnection.setConnectTimeout(3000);
23         httpURLConnection.setDoInput(true);
24         httpURLConnection.setRequestMethod("GET");
25         int code=httpURLConnection.getResponseCode();
26         if(code==200){
27             inputStream=httpURLConnection.getInputStream();
28         }
29     }
30     return inputStream;
31 }
32 public static void getImgToDisk() throws IOException{
33     InputStream inputStream=getInputStream();
34     FileOutputStream fileOutputStream=new FileOutputStream("D:\\TEST.png");
35     byte[] data=new byte[1024];
36     int len=0;
37     while((len=inputStream.read(data))!=-1){
38         fileOutputStream.write(data, 0, len);
39     }
40     if(inputStream!=null)
41         inputStream.close();
42     if(fileOutputStream!=null)
43         fileOutputStream.close();
44 }
45 public static void main(String[] args) throws IOException {
46     getImgToDisk();
47 }
48 }

案例2:以Java接口POST方式向服务器提交用户名和密码,在服务器端进行简单判断,如果正确返回字符串success,否则返回fail

服务器端简单校验:

 1  */
 2     public void doPost(HttpServletRequest request, HttpServletResponse response)
 3             throws ServletException, IOException {
 4         response.setContentType("text/html;charset=utf-8");
 5         request.setCharacterEncoding("utf-8");
 6         response.setCharacterEncoding("utf-8");
 7
 8         PrintWriter out = response.getWriter();
 9         //String jsonString =JsonTools.createJsonString("person", service.getPerson());
10         String name = request.getParameter("username");
11         String pwd = request.getParameter("password");
12         if (name.equals("admin")&&pwd.equals("123")) {
13              out.print("success");
14         }
15           else  {
16               out.print("fail");
17         }
18         out.flush();
19         out.close();
20     }

客户端的提交:

 1 package com.http.post;
 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
14 import sun.net.www.http.HttpClient;
15
16 public class HttpUtils {
17
18     private static String PATH="http://122.206.79.193:8080/myhttp/servlet/LoginAction";
19     private static URL URL;
20     static{
21         try {
22             URL=new URL(PATH);
23         } catch (MalformedURLException e) {
24             // TODO Auto-generated catch block
25             e.printStackTrace();
26         }
27     }
28     public HttpUtils() {
29         // TODO Auto-generated constructor stub
30     }
31
32     /**
33      *
34      * @param params 填写的参数
35      * @param encode 字节编码 为了避免乱码
36      * @return 从服务端返回的信息
37      * @throws Exception
38      */
39     public static String sendPostMessage(Map<String,String>params,String encode) throws Exception{
40          StringBuffer sb=new StringBuffer();
41          if(params!=null&&!params.isEmpty()){
42              for(Map.Entry<String,String> entry:params.entrySet()){
43                  sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(),encode)).append("&");
44              }
45              sb.deleteCharAt(sb.length()-1);
46              HttpURLConnection httpURLConnection=(HttpURLConnection)URL.openConnection();
47              httpURLConnection.setConnectTimeout(3000);
48              httpURLConnection.setDoInput(true);//从服务器获取数据
49              httpURLConnection.setDoOutput(true);//向服务器提交数据
50              //获得上传信息字节大小及长度
51              byte[] data=sb.toString().getBytes();
52             //浏览器内置封装了http协议信息,但是手机或者用Java访问时并没有 所以最重要的是需要设置请求体的属性封装http协议
53              //设置请求体的请求类型是文本类型
54              httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//文本类型
55             //设置请求体的长度
56              httpURLConnection.setRequestProperty("Content-Length",String.valueOf(data.length));
57              //想要向服务器提交数据必须设置输出流,向服务器输出数据
58              System.out.println(httpURLConnection.toString());
59              OutputStream out=httpURLConnection.getOutputStream();
60              out.write(data, 0, data.length);
61              out.close();
62              int code=httpURLConnection.getResponseCode();
63              if(code==200){
64                  return changeInputStream(httpURLConnection.getInputStream(),encode);
65              }
66
67          }
68         return "";
69     }
70     private static String changeInputStream(InputStream inputStream,String encode) {
71         // TODO Auto-generated method stub
72         String resString = "";
73         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//内存流
74         int len = 0;
75         byte[] data = new byte[1024];
76         try {
77             while ((len = inputStream.read(data)) != -1) {
78                 outputStream.write(data, 0, len);
79             }
80             resString = new String(outputStream.toByteArray());
81         } catch (IOException e) {
82             // TODO Auto-generated catch block
83             e.printStackTrace();
84         }
85         return resString;
86     }
87     public static void main(String[] args) throws Exception {
88         Map<String,String>params=new HashMap<String, String>();
89         params.put("username", "admin");
90         params.put("password", "123");
91         String res=sendPostMessage(params,"utf-8");
92         System.out.println("-res->>"+res);
93     }
94 }

标准Apache接口

 1 package com.http.post;
 2
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.UnsupportedEncodingException;
 7 import java.util.ArrayList;
 8 import java.util.HashMap;
 9 import java.util.List;
10 import java.util.Map;
11
12 import org.apache.http.HttpResponse;
13 import org.apache.http.NameValuePair;
14 import org.apache.http.client.ClientProtocolException;
15 import org.apache.http.client.entity.UrlEncodedFormEntity;
16 import org.apache.http.client.methods.HttpPost;
17 import org.apache.http.impl.client.DefaultHttpClient;
18 import org.apache.http.message.BasicNameValuePair;
19
20 public class HttpUtils {
21
22     public HttpUtils() {
23         // TODO Auto-generated constructor stub
24     }
25     public static String sendHttpClientPost(String path,Map<String,String>map,String encode) throws Exception, IOException{
26
27         //将参数map进行封装到list中
28         List<NameValuePair> list=new ArrayList<NameValuePair>();
29         if(map!=null&&!map.isEmpty()){
30             for(Map.Entry<String, String> entry:map.entrySet()){
31                 list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
32             }
33         }
34         try {
35             //将请求的参数封装的list到表单,即请求体中
36             UrlEncodedFormEntity entity=new UrlEncodedFormEntity(list,encode);
37             //使用post方式提交数据
38             HttpPost httpPost=new HttpPost(path);
39             httpPost.setEntity(entity);
40             DefaultHttpClient client=new DefaultHttpClient();
41             HttpResponse response= client.execute(httpPost);
42             //以上完成提交
43             //以下完成读取服务端返回的信息
44             if(response.getStatusLine().getStatusCode()==200){
45                 return changeInputStream(response.getEntity().getContent(),encode);
46             }
47         } catch (UnsupportedEncodingException e) {
48             // TODO Auto-generated catch block
49             e.printStackTrace();
50         }
51         return "";
52     }
53     public static String changeInputStream(InputStream inputStream,String encode) {
54         // TODO Auto-generated method stub
55         String resString = "";
56         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//内存流
57         int len = 0;
58         byte[] data = new byte[1024];
59         try {
60             while ((len = inputStream.read(data)) != -1) {
61                 outputStream.write(data, 0, len);
62             }
63             resString = new String(outputStream.toByteArray());
64         } catch (IOException e) {
65             // TODO Auto-generated catch block
66             e.printStackTrace();
67         }
68         return resString;
69     }
70     public static void main(String[] args) throws Exception, Exception {
71          String path="http://localhost:8080/myhttp/servlet/LoginAction";
72          Map<String,String>map=new HashMap<String, String>();
73         map.put("username", "admin");
74         map.put("password", "123");
75         String msg=HttpUtils.sendHttpClientPost(path, map, "utf-8");
76         System.out.println("-->>--"+msg);
77     }
78
79 }

时间: 2024-10-10 01:23:18

Android 之http编程的相关文章

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程中AsyncTask类的详细解释 1.Android单线程模型 2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装.简化异步操作. 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用As

Android 的网络编程

android的网络编程分为2种:基于socket的,和基于http协议的. 基于socket的用法 服务器端: 先启动一个服务器端的socket     ServerSocket svr = new ServerSocket(8989); 开始侦听请求 Socket s = svr.accept(); 取得输入和输出 DataInputStream dis = new DataInputStream(s.getInputStream()); DataOutputStream dos = new

Android开发经典书籍下载——《Android 4高级编程》《疯狂Android讲义》《Android应用开发详解(郭宏志)》《Android应用案例开发大全》《Android 3D游戏开发技术》

这是我收集的关于android开发方面的经典书籍,高清PDF电子版,可以在我的百度网盘免费下载,希望对需要的朋友有帮助. 目录: <Android 4高级编程>(附完整源代码) <疯狂Android讲义> <Android应用开发详解(郭宏志)> <Android应用案例开发大全> <Android 3D游戏开发技术> <Android内核剖析 柯元旦> <深入理解Android  卷1> <深入理解Android

超全Android JNI&NDK编程总结

由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK学习笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签名等,便于查阅相关资料.文末相关参考资料比较适合刚接触或者不熟悉Android NDK开发的朋友参阅. 常用命令 javac 编译java源文件生成.class文件 由于JNI对应的头文件由javah工具根据对应的.class文件生成,所以在进行JNI编程之前,写好Java代码后需要先编译,在使用ja

android 命令行编程

如果你想了解android上开发一个应用程序所需要的所有环节,在命令行上将这个过程操作一遍是最好的方法,下面你可以扔掉哪个慢腾腾的eclipse,然后建立如下一个auto.cmd文件,运行一下auto.cmd,你的电脑d:\work\njh1文件夹下就会产生一个SNjh.apk文件,该文件会自动安装到你手机上,并自动运行,这需要13个步骤,当然所用的环境为JDK1.7,ADT22.3,SDK API-17,d:盘建立文件夹work,当这些环境配好后就可以正常工作了,并且在系统环境中的path变量

Android C++高级编程

简介 <Android C++高级编程--使用NDK>提供了Java原生接口(JNI)的概述.Bionic API.POSIX 线程和套接字.C++支持.原生图形和声音API以及NEON/SIMD优化.   本文将记录主要知识点. 详解 1.深入了解Android NDK Android NDK不是一个独有的工具:它是一个包含API.交叉编译器.链接程序.调试器.构建工具.文档和实例应用程序的综合工具集.组件如下:ARM.x86和MIPS交叉编译器构建系统JAVA原生接口头文件C库Math库P

android开发常见编程错误总结

1.设置TextView的文本颜色 1 2 3 TextView tv; ... tv.setTextColor(R.color.white); 其实这样设置的颜色是 R.color.white的资源ID值所代表的颜色值,而不是资源color下的white颜色值:正确的做法如下: 1 tv.setTextColor(getResources().getColor(R.color.white)); 这个出错的概率满高的,就是因为二者都是int类,导致编译器不报错. 2.读取Cursor中的值 1

两分钟学会Android平台NDK编程(无须Eclipse和cygwin,可使用命令行打包多个so)

之前在进行cocos2dx开发时,已经详细介绍了如何将win32的c++代码移植到Android平台,当再次回顾时,发现一些基础的东西理解并不是很彻底,今天使用Android NDK提供的一个例子做一个简单的移植.在进行该demo前,请确认你已经配置了Android开发环境和安装了最新的Android NDK. 1.创建Android项目 创建一个Android项目 , 包名是com.example.hellojni,创建一个Activity作为程序进入的Acitivity,命名为HelloJn

Android平台NDK编程

转自:http://blog.csdn.net/wangbin_jxust/article/details/37389383 之前在进行cocos2dx开发时,已经详细介绍了如何将win32的c++代码移植到Android平台,当再次回顾时,发现一些基础的东西理解并不是很彻底,今天使用Android NDK提供的一个例子做一个简单的移植.在进行该demo前,请确认你已经配置了Android开发环境和安装了最新的Android NDK. 1.创建Android项目 创建一个Android项目 ,

Android jni本地编程入门

在某些情况下,java编程已经不能满足我们的需要,比如一个复杂的算法处理,这时候就需要用到jni技术: jni : java native interface jni 其实就是java和c/cpp之间进行通信的一个接口规范,java可以调用c/cpp里面的函数,同样,c/cpp也可以调用java类的方法: jni开发工具ndk的安装:在最新的ndk版本中,安装ndk很简单,只需要装ndk的路径配置到系统环境变量中即可:在编译的时候,进入工程根目录:执行命令  ndk-build  即可完成编译: