URL即统一资源定位器,它是指向互联网“资源”的指针。通常而言,URL可以由协议名、主机、端口和资源组成。如:protocol : //host : port/resourceName
URL是包含一个可打开到达该资源的输入流,这有别于URI,URI其实例仅仅代表一个统一资源标识符,不能直接定位于任何资源,只作解析之用。
URL对象的方法###
openConnection() 返回一个URLConnection对象,即可创建一个连接对象。
openStream() 打开此URL的连接,并返回一个用于读取该URL资源的输入流InputStream。
URL对象的其它有用的方法:getFile()、getHost()、getPath()、getPort()、getProtocol()、getQuery()
URLConnection如何提交请求,获取网络资源:
1.首先需要URL类的实例获取网址url
URL url = new URL("http://www.~~~~~");
2.用类URLConnection打开网络连接,即创建URLConnection对象实例:
URLConnection myConn = url.openConnection( );
注意:创建URLConnection对象实例后,还可设置其各参数和普通请求属性:
3.对于Get请求,需要建立实际的连接
myConn.connect();
对于Post请求,必须先获取URLConnection对象对应的输出流(即一定要先使用输出流,再使用输入流)
PrintWriter out = new PrintWriter(myConn.getOutputStream());
out.print(params); //发送请求参数params
out.flush();
4.一旦连接成功建立,远程资源就变为可用,此时程序就可以访问远程资源的头字段;或通过输入流读取远程资源的数据。
对于从网络上读到的数据,是用字节流的形式表示的,因此:
InputStream ins = myConn.getInputStream();
为了避免频繁读取,提高效率,往往需要用BufferedInputStream缓存读取到的输入流
BufferedInputStream bins = new BufferedInputStream(ins);
注意:getHeaderField()方法可根据响应头字段来返回对应的值。即可获取各头字段的值。其他另有可访问特定响应头字段的值:getDate、getContentEncoding、getContentLength、getContentType、getExpiration()
5.将已缓存的数据循环读入
代码示范:
使用URL直接读取网络资源(如图片)
try {
URL url = new URL("http://www.cnblogs.com/lovecode/updata/shilie.png");
//打开该URL对应的资源的输入流
InputStream is = url.openStream();
//从InputStream中解析出图片
Bitmap bitmap = BitmapFactory.decodeStream(is);
//使用ImageView组件显示该图片
showImgView.setImageBitmap(bitmap);
is.close();
//再次打开该URL对应的资源的输入流,这回我们将把它最后下载到本地存放
is = url.openStream();
//打开手机文件对应的输出流
OutputStream os = openFileOutput("crazyit.png", MODE_WORLD_READABLE);
byte[] buff = new byte[1024];
int hasRead = 0;
//将URL对应的资源下载到本地
while((hasRead = is.read(buff)) > 0)
{
os.write(buff, 0, hasRead);
}
is.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
使用URLConnection提交Get请求或Post请求
public class GetPostUtil
{
/**
* 向指定URL发送GET方法的请求
* @param url 发送请求的URL
* @parem params 请求参数,形式应该是name1=value1&name2=value2
* @return URL所代表的远程资源的响应结果
*/
public static String sendGet(String url, String params)
{
String result = "";
BufferedReader in = null;
try {
String urlString = url + "?" + params;
URL realUrl = new URL(urlString);
//打开和URL之间的连接,即创建一个URLConnection对象
URLConnection conn = realUrl.openConnection();
//设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/~~~~~~~~~~~");
//建立实际连接
conn.connect();
//这样就可获取所有响应头字段
Map<String, List<String>> map = conn.getHeaderFields();
//遍历所有的响应头字段
for(String key : map.keySet())
{
System.out.println(key + "--->" + map.get(key));
}
//也可读取从该URL获取的响应结果
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while((line = in.readLine()) != null)
{
result += "\n" + line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
} finally {
try {
if( in != null)
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
/**
* 向指定URL发送POST方法的请求
* @param url 发送请求的URL
* @parem params 请求参数,形式应该是name1=value1&name2=value2
* @return URL所代表的远程资源的响应结果
*/
public static String sendPost(String url, String params)
{
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
//打开和URL之间的连接,即创建一个URLConnection对象
URLConnection conn = realUrl.openConnection();
//设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/~~~~~~~~~~~");
//发送POST请求必须设置如下两项
conn.setDoOutput(true);
conn.setDoInput(true);
//获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
//发送请求参数
out.print(params);
//flush输出流的缓冲
out.flush();
//定义BufferedReader输入流来读取URL的响应结果
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
While((line = in.readLine()) != null)
{
result += "\n" + line;
}
} catch(Exception e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
HttpURLConnection#
Android 6.0(API 23) SDK后,Android的网络请求强制使用HttpUrlConnection,并且SDK中也移除了HttpClient库,同时也移除了SSL 和Notification的setLatestEventInfo方法。
HttpURLConnection继承了URLConnection,因此也可用于向指定网站发送Get请求、Post请求。它在URLConnection的基础上提供了如下便捷方法:
- getContentLength() 获取指定url的资源大小
- getResponseCode() 获取服务器的响应代码
- getResponseMessage() 获取服务器的响应信息
- getRequestMethod() 获取发送请求的方法
- setRequestMethod(method) 设置发送请求的方法
- setConnectTimeOut() 设置连接超时时间
- setRequestProperty() 设置请求的普通属性
/**
* 以下方法可将一个输入流转换为指定编码的字符串
* @param inputStream
* @return
*/
private static String changeInputStream(InputStream inputStream) {
String jsonString = "";
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] data = new byte[1024];
try {
while((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
}
jsonString = new String(outputStream.toByteArray());
}catch(IOException e) {
e.printStackTrace();
}
return jsonString;
}