android开发笔记之网络编程—使用HTTP进行网络编程
Posted minigeek
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android开发笔记之网络编程—使用HTTP进行网络编程相关的知识,希望对你有一定的参考价值。
上次我们讲到了使用URLConnection的网络编程,URLConnection已经可以非常方便地与指定站点交换信息,URLConnection下还有一个子类:HttpURLConnection。
HttpURLConnection在URLConnection的基础上进行改进,增加了一些用于操作HTTP资源的便捷方法。
setRequestMethod(String):设置发送请求的方法
getResponseCode():获取服务器的响应代码
getResponseMessage():获取服务器的响应消息
a)get请求的代码:
conn=(HttpURLConnection)url.openConnection();
//注意要大写
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);//连接超时的毫秒数
conn.setReadTimeout(8000);//读取超时的毫秒数
b)post请求的代码
conn=(HttpURLConnection)url.openConnection();
//注意要大写
conn.setRequestMethod("POST");
c)关闭连接
if(conn!=null)conn.disconnect();
注意需要的权限:
使用URLConnection的步骤:
①把网址填充成一个URL对象
URL url = new URL(String spec);
②获取客户端与服务器的连接对象,此时还没有连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
③对连接对象初始化
conn.setRequestMethod("GET"); //设置请求方式,注意大写
conn.setConnectTimeout(5000);//设置连接超时时间
conn.setReadTimeout(5000);//设置读取超时时间
④发送请求,建立连接
conn.connect();
⑤获取服务器响应中的流
InputStream is = conn.getInputStream();
⑥对流中的数据进行操作(如字符串、图片)
这里看一个使用HttpURLConnection下载图片的示例(只不过里面用了点小小的技巧,第一次加载网络图片,就将次图片缓存起来,以后加载就直接从缓存里取,不用访问网络):
效果:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.briup.httpurlconnection.MainActivity">
<Button
android:onClick="onClick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载图片"/>
<ImageView
android:id="@+id/iv" android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
MainActivity.java
package com.example.httpurlconnection;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView iv;
//网络图片的地址
private String path = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
public static final int SUCCESS = 0X1; //成功加载的标志
public static final int FAIL = 0X0; //失败加载的标志
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS:
iv.setImageBitmap((Bitmap) msg.obj);
break;
case FAIL:
Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
}
public void onClick(View view) {
final File mFile = new File(getCacheDir(),"a2.jpg");
//判断是否有缓存
if (mFile.exists()) {//有缓存
Toast.makeText(this,"使用缓存",Toast.LENGTH_LONG).show();
Bitmap bitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
iv.setImageBitmap(bitmap);
}else { //没有缓存,请求网络
new Thread(){
@Override
public void run() {
try {
Toast.makeText(MainActivity.this,"没有缓存",Toast.LENGTH_LONG).show();
//1.把网址填充成一个URL对象
URL url = new URL(path);
//2.获取客户端与服务器的连接对象,此时还没有连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//3.对连接对象初始化
conn.setRequestMethod("GET"); //设置请求方式,注意大写
conn.setConnectTimeout(5000);//设置连接超时时间
conn.setReadTimeout(5000);//设置读取超时时间
//4.发送请求,建立连接
conn.connect();
//返回码为200时表示请求成功
if (conn.getResponseCode() == 200) {
//获取服务器响应中的流
InputStream is = conn.getInputStream();
//把服务器的流中的数据写入本地文件,缓存起来
FileOutputStream fos = new FileOutputStream(mFile);
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b)) != -1) {
fos.write(b,0,len);
}
fos.flush();
fos.close();
//此时流中已经没有了数据
//从文件中获取图片
Bitmap bitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
Message msg = Message.obtain();
//加载成功
msg.what = SUCCESS;
msg.obj = bitmap;
mHandler.sendMessage(msg);
}else {
Message msg = Message.obtain();
//加载失败
msg.what = FAIL;
mHandler.sendMessage(msg);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
HttpURLConnection源码下载地址:http://download.csdn.net
——HttpClient
android5.0之前.常用
android5.0之后,被HttpURLConnecetion替代
android6.0完全被舍弃
HttpClient是Apache提供的Http网络访问接口。完成的功能和HttpURLConnection几乎一模一样的效果,但两者的用法有很大的差别。
在一般情况下,如果只是需要向Web站点的某个简单页面提交请求并获取服务器响应,完全可以使用前面介绍的HttpURLConnection来完成,但是在绝大部分情况下,Web站点网页没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面,在这种情况下,就需要涉及Session,Cookie的处理了。
HttpClient是一个简单的HTTP客户端,并不是浏览器。可以用于发送HTTP请求,接受HTTP响应,但不会缓存服务器的响应,不能执行html页面中嵌入的javascript代码,也不会对页面进行任何解析,处理。
HttpClient会自动维护与服务器之间的Session状态,但是前提是使用同一个HttpClient对象发送请求。
使用HttpClient的步骤:HttpClient是一个接口。
a)创建HttpClient对象:new DefaultHttpClient();
b)如果需要发送GET请求,创建HttpGet对象,并指定地址。
如果需要发送Post请求,创建HttpPost对象,
c)如果需要发送请求参数,可调用HttpGet,HttpPost共同的setParams(HttpParams)方法来添加请求参数,对于HttpPost对象而言,也可调用setEntity(HttpEntity)方法设置请求参数。
使用HttpEntity下的UrlEncodedFormEntitiy对象传入一个放入BasicNameValuePair的集合中提交的数据。
如:
HttpPost post=new HttpPost("");
List<NameValuePair> list=new ArrayList<>();
list.add(new BasicNameValuePair("name",name));
list.add(new BasicNameValuePair("pwd", pwd));
post.setEntity(new UrlEncodedFormEntity(list,"UTF-8"));
d)调用HttpClient对象execute(HttpUriRequest)发送请求,执行该方法返回一个HttpResponse;
e)调用HttpResponse的getstatusLine().getStatesCode()方法可以获取响应的状态码,如果是200就代码是成功的状态。调用HttpResponse的getEntity()方法获取HttpEntity对象,
该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。然后再用EntityUtils.toString(HttpEntity,"编码方式")将其转成为字符串。
——HttpClient返回不同数据的解析方式
a)返回普通的text数据
b)返回html数据
c)返回xml数据
xml的解析可以采用sax,dom,dom4j,pull
d)返回JSON数据(在上次的文章JSON解析中提到过)
注意:
1.中文乱码问题:三种方式
String n=URLEncoder.encode(“张三”, “UTF-8”);
String n=EncodingUtils.getString(“张三”.getBytes(),”UTF-8”);该方式已经过时了
con.setRequestProperty(“Charset”, “UTF-8”);
2.HttpClient类把编译版本换到6.0以下应该就能用了,
在6.0的时候删除httpclient了,
在5.1他就过时了,官方不推荐使用了.
以上是关于android开发笔记之网络编程—使用HTTP进行网络编程的主要内容,如果未能解决你的问题,请参考以下文章