一起学Android之Http访问

时间:2022-06-28 02:53:03

概述

在Android开发中,一般通过网络进行访问服务器端的信息(存储和检索网络中的数据),如API接口,WebService,网络图片等。今天主要讲解Http访问的常用方法,仅供学习分享使用。

涉及知识点

  1. URL 表示互联网位置的统一资源标识符。
  2. HttpURLConnection 表示一个URL的Http连接,是一个抽象类,通过URL中的 openConnection()实例化一个连接对象。
  3. setConnectTimeout(5000) 设置超时时间,setRequestMethod("GET") 设置访问方式。
  4. getResponseCode() 获取返回码,如200表示成功。
  5. getInputStream() 返回读取到数据的字节流; getOutputStream() 返回往指定URL写入数据的字节流。
  6. ByteArrayOutputStream 数组和输出流之间的转换。
  7. WebView 用于显示Web Page的一个控件,通过loadDataWithBaseURL(String baseUrl, String data,String mimeType, String encoding, String historyUrl)加载内容。

Http访问步骤

  1. 创建一个URL对象: URL url = new URL(https://www.baidu.com);
  2. 调用URL对象的openConnection( )来获取HttpURLConnection对象实例: HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  3. 设置HTTP请求使用的方法:GET或者POST,或者其他请求方式比如:PUT conn.setRequestMethod("GET");
  4. 设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头 conn.setConnectTimeout(6*1000); conn.setReadTimeout(6 * 1000);
  5. 调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取了 InputStream in = conn.getInputStream();
  6. 最后调用disconnect()方法将HTTP连接关掉 conn.disconnect();

示例图

如下图所示:

一起学Android之Http访问

核心代码

获取数据类

 /**
* Created by hex on 2019/4/6.
*/
public class GetData {
// 定义一个获取网络图片数据的方法:
public static byte[] getImage(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置连接超时为5秒
conn.setConnectTimeout(5000);
// 设置请求类型为Get类型
conn.setRequestMethod("GET");
// 判断请求Url是否成功
if (conn.getResponseCode() != 200) {
throw new RuntimeException("请求url失败");
}
InputStream inStream = conn.getInputStream();
byte[] bt = StreamTool.read(inStream);
inStream.close();
return bt;
} // 获取网页的html源代码
public static String getHtml(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
InputStream in = conn.getInputStream();
byte[] data = StreamTool.read(in);
String html = new String(data, "UTF-8");
return html;
}
return null;
}
}

InputStream转换为byte[]功能

 /**
* Created by Administrator on 2019/4/6.
*/
public class StreamTool {
//从流中读取数据
public static byte[] read(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}

刷新界面赋值

 // 用于刷新界面
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0x001:
hideAllWidget();
imgPic.setVisibility(View.VISIBLE);
imgPic.setImageBitmap(bitmap);
Toast.makeText(MainActivity.this, "图片加载完毕", Toast.LENGTH_SHORT).show();
break;
case 0x002:
hideAllWidget();
scroll.setVisibility(View.VISIBLE);
txtshow.setText(detail);
Toast.makeText(MainActivity.this, "HTML代码加载完毕", Toast.LENGTH_SHORT).show();
break;
case 0x003:
hideAllWidget();
webView.setVisibility(View.VISIBLE);
webView.loadDataWithBaseURL("", detail, "text/html", "UTF-8", "");
Toast.makeText(MainActivity.this, "网页加载完毕", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
} ;
};

如果要访问网络,还需要有相应的权限

  <uses-permission android:name="android.permission.INTERNET" />

备注

关于Http访问的相关知识还有很多,本文知识简单粗略的讲解,希望抛砖引玉,共同学习。