一、HTTP协议的基础知识
服务器端返回数据的三种主要方式:HTML, XML, JSON,
二、方式:Get和Post.
三、特点:
1、Get : (1)将键值对放在URL后面传递(URL?key=value&key=value的形式)
(2)服务器端直接读取,效率高,用Request.QueryString获取变量的值
(3)缺乏安全性
(4)长度有限制
(5)是中文数据,且不敏感,可以采用Get
2、Post:(1)可以将数据转化成二进制打包,放在Http的报头中【HTML Header】
(2)不受URL长度限制,可以传输大量数据
(3)不显示在浏览器地址栏中,安全性较好,服务器端用Request.Form获取
(4)效率相比较低
(5)非中文数据,或敏感,采用Post
三、输入流和输出流
【记住以程序为中心,服务器数据流进程序是输入流,程序将文件保存到本地是输出流】
输入流(InputStream):程序通过输入流从数据源(如服务器)读取数据
输出流(OutputStream):程序通过输出流向目的地写数据
四、使用:
JAVA中HTTP编程的两种方式:
1、 标准JAVA接口
2、 标准Apache接口
Android中HTTP编程的两种方式:
1、以HttpURLConnection模拟请求【传统JAVA使用的方法】
2、HttpClient【推荐使用,代码少,效率高】
五、【JAVA】以HttpURLConnection模拟Get请求获得服务上的一张图片
public class HttpUtils {
private static String URL_PATH = "http://192.168.0.102:8080/myhttp/pro1.png";
public HttpUtils()
{ // TODO Auto-generated constructor stub}
//将图片输出到本地磁盘上
public static void saveImageToDisk() {
InputStream inputStream = getInputStream();
byte[] data = new byte[1024];
int len = 0;
//定义输出流,让文件输出至磁盘
FileOutputStream fileOutputStream = null;
try {
//输出流的内容为输出到C盘下的test.png
fileOutputStream = new FileOutputStream("C:\\test.png");
//读取文件的字节流(输入流),其返回值不为-1(读完了)时,将其写入输出流
while ((len = inputStream.read(data)) != -1) {
/*data是要写入的字节数组;0是读入数组的初始位置,以后每次加1;
*len是读取长度,大于读取长度时读1024byte,小于时读剩下的所有byte,没有时值为-1;
*写入输出流
*/
fileOutputStream.write(data, 0, len);
}
} catch (IOException e){
e.printStackTrace();
} finally {
/*如果输入流不是对象(在初始化时就出错了),或者已经没有内容了
*关闭输入流就会出现空指针异常
*所以需要判断一下再关闭
*/
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
//注释同上
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
/**
* 获得服务器端的数据,以InputStream形式返回,URL中已经包括了该图片的位置信*息
* @return
*/
public static InputStream getInputStream() {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null;
try {
URL url = new URL(URL_PATH);
if (url != null) {
httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置连接网络的超时时间
httpURLConnection.setConnectTimeout(3000);
httpURLConnection.setDoInput(true);
// 表示设置本次http请求使用GET方式请求
httpURLConnection.setRequestMethod("GET");
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200) {
// 从服务器获得一个输入流
inputStream = httpURLConnection.getInputStream();
}
}
} catch (MalformedURLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
return inputStream;
}
public static void main(String[] args) {
// 从服务器获得图片保存到本地
saveImageToDisk();
}
}