一、网络HttpURLConnection 类
HttpURLConnection 类是基于HTTP协议的,其底层是通过Socket实现的。
URL请求的类别:
分为二类,GET与POST请求。二者的区别在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
Http协议支持的操作有GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE,其中最最常用的还是GET和POST操作,下面我们看一下GET和POST的区别。
GET:
GET请求可以被缓存。 我们之前提到,当发送键值对信息时,可以在URL上面直接追加键值对参数。当用GET请求发送键值对时,键值对会随着URL一起发送的。 由于GET请求发送的键值对时随着URL一起发送的,所以一旦该URL被黑客截获,那么就能看到发送的键值对信息,所以GET请求的安全性很低,不能用GET请求发送敏感的信息(比如用户名密码)。 由于URL不能超过2048个字符,所以GET请求发送数据是有长度限制的。 由于GET请求较低的安全性,我们不应该用GET请求去执行增加、删除、修改等的操作,应该只用它获取数据。
POST:
POST请求从不会被缓存。 POST请求的URL中追加键值对参数,不过这些键值对参数不是随着URL发送的,而是被放入到请求体中发送的,这样安全性稍微好一些。 应该用POST请求发送敏感信息,而不是用GET。 由于可以在请求体中发送任意的数据,所以理论上POST请求不存在发送数据大小的限制。 当执行增减、删除、修改等操作时,应该使用POST请求,而不应该使用GET请求。
a. 从客户端得到服务端数据 GET
1、 示例1,如何得到HttpURLConnection 类,及使用它的各种方法,得到输入流。
URL url=new URL(urlString);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
// 链接超时时间
connection.setConnectTimeout(30000);
connection.setRequestMethod("GET");
// 开始请求
connection.connect();
// 请求的状态码,200是成功,404等
int responseCode=connection.getResponseCode();
String responseMessage=connection.getResponseMessage();
String result=null;
if(responseCode==HttpURLConnection.HTTP_OK){
InputStream inputStream=connection.getInputStream();
示例2,如何得到HttpURLConnection 类,及使用它的各种方法,得到输入流。
URL url = new URL(urlString); //URL对象
conn = (HttpURLConnection)url.openConnection(); //使用URL打开一个链接
conn.setDoInput(true); //允许输入流,即允许下载
conn.setDoOutput(true); //允许输出流,即允许上传
conn.setUseCaches(false); //不使用缓冲
conn.setRequestMethod("GET"); //使用get请求
is = conn.getInputStream(); //获取输入流,此时才真正建立链接
b.客户端向服务端发送数据 POST
// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在
2 // http正文内,因此需要设为true, 默认情况下是false;
3 httpUrlConnection.setDoOutput(true);
4
5 // 设置是否从httpUrlConnection读入,默认情况下是true;
6 httpUrlConnection.setDoInput(true);
7
8 // Post 请求不能使用缓存
9 httpUrlConnection.setUseCaches(false);
10
11 // 设定传送的内容类型是可序列化的java对象
12 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
13 httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
14
15 // 设定请求的方法为"POST",默认是GET
16 httpUrlConnection.setRequestMethod("POST");
17
18 // 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成,
19 httpUrlConnection.connect();
// 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,
// 所以在开发中不调用上述的connect()也可以)。
OutputStream outStrm = httpUrlConnection.getOutputStream();
二、I/O
a.从网路得到数据输入流,从输入流解析到数据
1.a 一种解析输入流的方式
Reader reader=new InputStreamReader(inputStream,"UTF-8");
char[] buffer=new char[1024];
reader.read(buffer);
result=new String(buffer);
1.b 一种解析输入流的方式
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
result = sbf.toString();
2.解析为图片, 参数is是输入流
// ImageView设置Bitmap,用BitMap工厂解析输入流
mIvShow.setImageBitmap(BitmapFactory.decodeStream(is));
b.客户端向服务端发送数据,POST时 输出流
//获取conn的输出流
OutputStream os = conn.getOutputStream();
//读取assets目录下的person.xml文件,将其字节数组作为请求体
requestBody = getBytesFromAssets("person.xml");
//将请求体写入到conn的输出流中
os.write(requestBody);
//记得调用输出流的flush方法
os.flush();
//关闭输出流
os.close();