首先介绍下URLConnection,
URLConnection是一个抽象类,表示指向url资源的活动连接,URLConnection有两个不同的但相关的用途。
首先,与URL相比,他对服务器的交互提供了更多的控制。URLConnection可以检查服务器发送的首部,并相应
的做出相应,它可以设置客户端请求中使用的首部字段。除此之外,URLConnection可以用POST、PUT和其他HTTP
请求想服务器发送数据。
首先直接看实现代码:
核心方法:
public InputStream post() throws IOException{
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
try (OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(),"UTF-8")){
out.write(query.toString());
out.write("\r\n");
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
return uc.getInputStream();
}
如上代码可知,
必须要有uc.setDoOutput(ture);这一行,
表示可以向服务器输入数据。
接着,获取outputStream,并写入相关查询行。
接下来看其他相关类代码:
package anla.Network.uriAndUrl;
import java.net.URLEncoder;
public class QueryString {
private StringBuilder query = new StringBuilder();
public synchronized void add(String name,String value){
query.append('&');
encode(name,value);
}
public synchronized void encode(String name,String value){
try {
query.append(URLEncoder.encode(name,"UTF-8"));
query.append('=');
query.append(URLEncoder.encode(value, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized String getQuery(){
return query.toString();
}
@Override
public String toString() {
return super.toString();
}
}
以及整个类:
package anla.Network.urlConnection;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import anla.Network.uriAndUrl.QueryString;
public class FormPoster {
private URL url;
private QueryString query = new QueryString();
public FormPoster (URL url){
if(!url.getProtocol().toLowerCase().startsWith("http")){
throw new IllegalArgumentException("Posting only works for http URLs");
}
this.url = url;
}
public void add(String name,String value){
query.add(name, value);
}
public URL getURL(){
return this.url;
}
public InputStream post() throws IOException{
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
try (OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(),"UTF-8")){
out.write(query.toString());
out.write("\r\n");
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
return uc.getInputStream();
}
}
有时间去研究下httpclient,看核心原理是否是这样的。