导语
有时你需要通过URLConnection向服务器写入数据,例如,使用POST向Web服务器提交表单,或使用PUT上传文件。getOutputStream() 方法返回一个OutputStream,可以用来向服务器发送数据。由于URLConnection 在默认情况下不允许输出,所以在请求输出流之前必须调用setDoOutput(true)。当将一个http URL的doOutput设置为true时,请求方式将会由GET变为POST方法。
一个小案例
try {
URL u = new URL("http://www.xdysite.cn/index.php");
URLConnection uc = u.openConnection();
uc.setDoOutput(true);
try (Writer w = new BufferedWriter(new OutputStreamWriter(uc.getOutputStream()))) {
w.write("username=xdy&password=123456");
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
向服务器提交表单
上面的只是一个小案例来说明如何向服务器提交数据,下面我们将其功能进行完善。尽可能使用JAVA的封装特性。QueryString用于生成一个合法的表单。FormPoster 类提供表单的提交。在main方法中进行测试以及输出服务器返回的数据。
QueryString类
public class QueryString {
StringBuilder sb;
public QueryString(){
sb = new StringBuilder();
}
public void add(String key, String val) {
sb.append(key + "=" + val + "&");
}
@Override
public String toString() {
sb.append("needless=0");
return sb.toString();
}
}
FormPoster类
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");
url = _url;
}
public void add(String name, String value) {
query.add(name, value);
}
public URL getURL() {
return url;
}
public InputStream post() throws IOException {
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(uc.getOutputStream()))) {
bw.write(query.toString());
bw.write("
");
}
return uc.getInputStream();
}
}
测试方法
public static void main(String[] args) {
URL url;
try {
url = new URL("http://www.xdysite.cn/index.php");
} catch (MalformedURLException e) {
e.printStackTrace();
return;
}
FormPoster poster = new FormPoster(url);
poster.add("username", "xdy");
poster.add("password", "12345");
try (Reader r = new InputStreamReader(poster.post())) {
int c;
while ((c = r.read()) != -1) {
System.out.print((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}
}