URLConnection是一个协议处理器中的一个类,它是表示指向URL所指定的资源的活动连接。主要用于两个方面,一个是与服务器(特别是HTTP服务器)的交互,可以用来查看服务器发送的首部,设置连接的属性,设置客户端的请求的首部等。利用它也可以实现POST和PUT方法来发送数据。另一个方面是Java的协议处理器机制的一部分。所谓的协议处理器就是将处理协议的细节从处理特定数据类型中分离出,会涉及到客户端与服务器端的交互,如生成正确的请求格式,解释与数据一起返回的首部等。
URLConnection可以利用POST,PUT等请求方法与服务器进行交互
利用URL与URLConnection都可以向服务器发送HTTP请求。
1,创建一个URL,传递一个字符串形式的HTTP请求,可以加上查询字符串,此时默认动作类型是get,也就是查询,从服务器返回一个资源,再通过getInputStream正式的建立客户端与服务器之间的连接,将该HTTP请求发送到服务器端,建立必要的握手,由于HTTP是全双工的,此时就可以在这里面获取服务器的返回输出流。
URL u=new URL(url);
URLConnection uc=u.openConnection();
String type=uc.getContentType();
//获取字符编码方式
int star=type.indexOf("charset=");
if(star!=-1)
encoding=type.substring(star+8);
System.out.println("CharSet:"+encoding);
InputStream raw=uc.getInputStream();
Reader r=new InputStreamReader(new BufferedInputStream(raw),encoding);
String contentType=uc.getContentType();
int contentLength=uc.getContentLength();
if(contentType.startsWith("text/")||contentLength==-1)
{
thrownew IOException("This is not a binary file");
}
InputStream raw=new BufferedInputStream(uc.getInputStream());
byte[] data=newbyte[contentLength];
int bytesRead=0;
int offset=0;
while(offset<contentLength)
{
bytesRead=raw.read(data, offset, contentLength);
if(bytesRead==-1)break;
offset+=bytesRead;
}
raw.close();
if(offset!=contentLength)
{
thrownew IOException("Only read "+offset+ "bytes;Expected "+contentLength+" bytes");
}
//根据URL中获取文件路径的名,将获取的流写入到本地
String file=url.getFile();
int start=file.lastIndexOf("/");
String filename=file.substring(start+1);
FileOutputStream fout=new FileOutputStream(filename);
fout.write(data);
fout.flush();
fout.close();
URLConnection uc=u.openConnection();
for(int j=1;;j++)
{
String header=uc.getHeaderField(j);
if(header==null)break;//skip the loop
System.out.println(uc.getHeaderFieldKey(j)+":"+header);
}
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URL;
import java.net.URLConnection;
//模拟表单提交处理
publicclass FormPoster {
private URL url;
private QueryString query=new QueryString();
//必须要保证是http协议
public FormPoster(URL url)
{
if(!url.getProtocol().toUpperCase().startsWith("HTTP"))
{
thrownew IllegalArgumentException("Posting only works for http urls");
}
this.url=url;
}
publicvoid add(String name,String value)
{
query.add(name, value);
}
public URL getURL()
{
returnthis.url;
}
public InputStream post()throws IOException
{
URLConnection uc=url.openConnection();
uc.setDoOutput(true);
Writer out=new OutputStreamWriter(uc.getOutputStream(),"ASCII");
//POST行,Content-type和Content-length是由URLConnection发送的
//只需要发送数据即可
out.write(query.toString());
out.write("\r\n\r\n");
out.flush();
out.close();
return uc.getInputStream();
}
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
String u="http://www.baidu.com";
URL url=null;
try{
url=new URL(u);
}catch(IOException e)
{
}
FormPoster poster=new FormPoster(url);
poster.add("hawk", "fdafda");
poster.add("good morning", "fdafa");
try{
InputStream in=poster.post();
//读取响应
InputStreamReader r=new InputStreamReader(in);
int c;
while((c=r.read())!=-1)
{
System.out.print((char)c);
}
in.close();
}catch(IOException ex)
{
System.err.println(ex);
}
}
}