HttpClient向服务器提交数据

导语

有时你需要通过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("\r\n");
		}
		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();
		}
	}
posted @ 2016-12-13 12:09  被罚站的树  阅读(307)  评论(0编辑  收藏  举报