您的位置:首页 > 理论基础 > 计算机网络

Android-获取网络数据、发送请求

2013-06-28 19:25 796 查看
一、获取网络上的文本数据

页面布局
一个EditText输入网址、一个Button提交、一个 TextView 显示结果,分别添加EditText、TextView的id
让内容横竖滚动:在TextView外套一个ScrollView,再套一个HorizontalScrollView

访问网络
URL  url  = new URL("输入的网址");  HttpURLConnection  conn = url.openConnection();
以流的方式获取数据:conn.getInputStream();
获取数据后,因为是文本数据,直接为TextView赋Text值

权限
清单文件中配置   <uses-permission android:name="android.permission.INTERNET" />

二、获取服务器上的图片数据

布局和以上文本布局基本一样,只需再添加ImageView
获取图片
基本原理和获取文本数据一样,唯一不同的是需要返回的是图片;图片肯定不能以字符串返回,是由Bitmap返回
Bitmap  bm = BitmapFactory.decodeByteArray("byte数组",0,"数组长度");
在ImageView中设置setImageBitmap(Bitmap  bit);

图片的缓存
将图片缓存在文件中,File  cacheFile = new File(context.getCacheDir(),UrlEncoder.encode(address));
判断如果文件存在修改服务器里文件的最后访问时间:conn.setIfM[b][b]o[/b]difiedSince(cacheFile.lastModified());[/b]
如果不存在且响应吗为200,创建Bitmap  bm  = BitmapFactory.decodeByteArray(data,0,data.length);
并把字节数组解码为Bitmap图片:bm.compress(CompressFormat.JPEG,100,new FileOutputStream(cacheFile)); 返回bm;

如果响应码为304表示需要读取缓存文件:Bitmap bm = BitmapFactory.decodeFile(cacheFile.getAbsolutePath());
响应吗都不正确抛出异常

三、发送请求

1.GET
数据发送之前需要经过URLEncoder进行编码
将要发送的数据拼接在地址后面即可
2.POST
数据同样需要编码
setRequestMethod()设置请求方式
setRequestProperty()设置请求头ContentType和ContentLength
setDoOutput()设置需要写出消息体
getOutputStream()获取输出流写出数据

一.获取网络文本
1.访问网络
创建URL对象封装地址
调用openConnection()方法打开一个HttpURLConnection对象
setConnectionTimeOut()设置超时时间
getResponseCode()获取响应码
getInputStream()获取输入流读取数据
将读取到的字节数据解码为字符串
2.权限
访问网络是需要计费的操作, 需要权限<uses-permission android:name="android.permission.INTERNET"/>

二.获取网络图片
1.获取图片
和获取文本相同, 都是读取服务端数据
不同的是将字节数据解码为Bitmap
2.缓存
第一次访问的时候从网络获取, 得到图片之后用文件的方式保存到本地
下次再访问时判断缓存文件是否存在, 如果存在就把缓存文件的最后修改时间发给服务器
服务器会判断缓存文件和服务端文件的修改时间, 如果服务端文件没修改就会响应304, 如果服务端文件已修改则响应200
客户端根据服务端响应码判断读缓存文件还是重新读取网络

三.发送请求
1.GET
数据发送之前需要经过URLEncoder进行编码
将要发送的数据拼接在地址后面即可
2.POST
数据同样需要编码
setRequestMethod()设置请求方式
setRequestProperty()设置请求头ContentType和ContentLength
setDoOutput()设置需要写出消息体
getOutputStream()获取输出流写出数据

[b]GET发送请求[/b]
[b]对传入的数据进行URLEncoder.encode(username)编码[/b]
[b]设置请求方式  conn.setRequestMethod("GET");[/b]
将path和编码后的数据组拼成一个请求地址:http://localshot:8080/4.1.1WebService?username=xxx&password=ooo
[b]conn.getInputStream()获得服务器的响应码和响应数据返回[/b]

[b]POST发送请求[/b]
[b]同样需要对传入的数据进行编码:username = URLEncoder.encode(username);[/b]
[b]设置请求方式:conn.setRequestMethod("POST");[/b]
设置两个请求头:conn.setRequestPro
4000
perty("Content-Type","...."); conn.setRequestProperty("Content-Length",data.getLength()+"");
将请求发给服务器:conn.setDoOutput(true); conn.getOutputStream().write(data.getBytes());
获取响应吗给浏览器响应:conn==200?   conn.getInputStream();  ...

[b]HttpClient发送请求:浏览器的简单包装,就相当于一个简单的浏览器,google提供的开源项目[/b]
[b]HttpClient的GET:[/b]
[b]先对传入的数据进行编码  username = URLEncoder.encode(username);  //准备数据[/b]
[b]HttpClient  client = new DefaultHttpClient(); // 获取到一个浏览器[/b]
[b]HttpGet  httpGet = new HttpGet(path +"?username="+username+"&password="+password);[/b]
HttpResponse  response = client.execute(httpGet); //浏览器执行地址栏的请求地址
[b]int code = response.getStatusLine().getStatusCode();  //得到状态行的响应吗[/b]
[b]code==200?  等于的话   InputStream in = response.getEntity().getContent();//获得流,返回数据[/b]

[b]HttpClient的Post:[/b]

HttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost(path);//2. 准备要请求的 数据类型 
List< NameValuePair> parameters = new ArrayList<NameValuePair>();// 键值对 
parameters.add(new BasicNameValuePair("name", name));
parameters.add(new BasicNameValuePair("password", password));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8");
httppost.setEntity(entity);//3.设置post请求的数据实体
HttpResponse  ressponse = client.execute(httppost);//4. 发送数据给服务器
int code = ressponse.getStatusLine().getStatusCode();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐