【Java】使用URL类访问互联网资源

Java的java.net.URL类用于请求互联网上的资源,采用HTTP/HTTPS协议,请求方法是GET方法,一般请求是静态的,少量的服务器端数据。

三种连接方法:

// 方法一

URL url = new URL("http://www.sina.com.cn"); 

URLConnection urlcon = url.openConnection(); 

InputStream is = urlcon.getInputStream(); 

// 方法二

URL url = new URL("http://www.yhfund.com.cn"); 

HttpURLConnection urlcon = (HttpURLConnection)url.openConnection(); 

InputStream is = urlcon.getInputStream(); 

// 方法三

URL url = new URL("http://www.yhfund.com.cn"); 

InputStream is = url.openStream();

 1.使用URL类

下面通过一个示例介绍如何使用java.net.URL类:

package url;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class HelloWorld {

	public static void main(String[] args) {
		//Web网址
		String url="http://www.sina.com.cn";
		
		URL reqURL;
		try {
			reqURL=new URL(url);
		} catch (MalformedURLException e) {
			e.printStackTrace();
			return;
		}
		
		try(
				//打开网络通信输入流
				InputStream is=reqURL.openStream();
				InputStreamReader isr=new InputStreamReader(is,"utf-8");
				BufferedReader br=new BufferedReader(isr)
				) {
			StringBuilder sb=new StringBuilder();
			String line=br.readLine();
			while(line!=null)
			{
				sb.append(line);
				sb.append('\n');
				line=br.readLine();
			}
			//日志输出
			System.out.println(sb);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

上述代码创建URL对象,参数是一个HTTP网址。通过URL对象的openStream()方法打开输入流。 

2.使用HttpURLConnection发送GET请求

由于URL类只能发送HTTP/HTTPS的GET方法请求,如果要想发送其他的情况或者对网络请求有更深入的控制,则可以使用HttpURLConnection类型。

示例代码如下:

package url;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConGET {

	//Web服务网址
	static String urlString="http://www.51work6.com/service/mynotes/WebService.php?"+"email=<此处填写在该网页注册时的邮箱>&type=JSON&action=query";
	public static void main(String[] args) {
		BufferedReader br=null;
		HttpURLConnection conn=null;
		try {
			URL reqURL=new URL(urlString);
			conn=(HttpURLConnection)reqURL.openConnection();
			conn.setRequestMethod("GET");
			
			//打开网络通信输入流
			InputStream is=conn.getInputStream();
			//通过is创建InputStreamReader对象
			InputStreamReader isr=new InputStreamReader(is,"utf-8");
			//通过isr创建BufferedReader对象
			br=new BufferedReader(isr);
			
			StringBuilder sb=new StringBuilder();
			String line=br.readLine();
			while(line!=null)
			{
				sb.append(line);
				line=br.readLine();
			}
			//日志输出
			System.out.println(sb);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(conn!=null)
			{
				conn.disconnect();
			}
			if(br!=null)
			{
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

注意:发送GET请求时发送给服务器的参数是放在URL的"?"之后,参数采用键值对形式。多个参数之间用“&”分隔,例如type=JSON&action=query就是两个参数。

上述代码用reqURL.openConnection()方法打开一个连接,返回URLConnetion对象。由于本次连接是HTTP连接,所以返回的是HttpURLConnection对象。URLConnection是抽象类,HttpURLConnection是URLConnection的子类。

代码中conn.setRequestMethod("GET")设置请求方法为GET方法。通过conn.getInputStream()打开输入流。通过conn.disconnect()断开连接,这可以释放资源。

3.使用HttpURLConnection发送POST请求

示例代码如下:

package url;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConPOST {

		//Web服务网址
		static String urlString="http://www.51work6.com/service/mynotes/WebService.php?";
		public static void main(String[] args) {
			BufferedReader br=null;
			HttpURLConnection conn=null;
			try {
				URL reqURL=new URL(urlString);
				conn=(HttpURLConnection)reqURL.openConnection();
				conn.setRequestMethod("POST");
				//设置请求过程中可以传递参数给服务器
				conn.setDoOutput(true);
				String param=String.format("email=%s&type=%s&action=%s","<此处填写在该网页注册时的邮箱>","JSON","query");
				//设置参数
				DataOutputStream dStream=new DataOutputStream(conn.getOutputStream());
				dStream.writeBytes(param);
				dStream.close();
				//打开网络通信输入流
				InputStream is=conn.getInputStream();
				//通过is创建InputStreamReader对象
				InputStreamReader isr=new InputStreamReader(is,"utf-8");
				//通过isr创建BufferedReader对象
				br=new BufferedReader(isr);
				
				StringBuilder sb=new StringBuilder();
				String line=br.readLine();
				while(line!=null)
				{
					sb.append(line);
					line=br.readLine();
				}
				//日志输出
				System.out.println(sb);
			} catch (Exception e) {
				e.printStackTrace();
			}finally {
				if(conn!=null)
				{
					conn.disconnect();
				}
				if(br!=null)
				{
					try {
						br.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
}

上述代码URL后面不带参数,这是因为要发送的是POST请求,POST请求参数是放在请求体中。

4.案例:下载程序

Downloader.java代码如下:

package url;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class Downloader {
	//Web服务网址
	private static String urlString="http://ss0.bdstatic.com/5aV1bjqh_Q23odcf/"+"static/superman/img/logo/bd_logol_31bdc765.png";
	public static void main(String[] args) {
		download();
	}
	//下载方法
	private static void download() {
		HttpURLConnection conn=null;
		try {
			//创建URL对象
			URL reqURL=new URL(urlString);
			//打开连接
			conn=(HttpURLConnection)reqURL.openConnection();
			try(
					//从连接对象获得输入流
					InputStream is=conn.getInputStream();
					BufferedInputStream bin=new BufferedInputStream(is);
					//创建文件输出流
					OutputStream os=new FileOutputStream("download.png");
					BufferedOutputStream bout=new BufferedOutputStream(os)
					){
				byte[] buffer=new byte[1024];
				int bytesRead=bin.read(buffer);
				while(bytesRead!=-1)
				{
					bout.write(buffer,0,bytesRead);
					bytesRead=bin.read(buffer);
				}
			}catch(IOException e) {
			}
			System.out.println("下载完成。");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(conn!=null)
			{
				conn.disconnect();
			}
		}
	}

}

猜你喜欢

转载自blog.csdn.net/shimadear/article/details/88087617