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();
}
}
}
}