• 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("
    ");
    		}
    		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();
    		}
    	}
  • 相关阅读:
    使用AStyle进行代码格式化
    ubuntu14.04设置静态ip
    网络模拟器WANem使用配置图文教程
    ServerSocket 默认邦定IP
    shell判断文件是否存在
    linux文本模式下使用PPPOE拨号ADSL上网的方法
    几个国内速度最快的centos yum(更新源)
    linux命令执行返回值(附错误对照表)
    如何在java程序中调用linux命令或者shell脚本
    windows多线程详解
  • 原文地址:https://www.cnblogs.com/xidongyu/p/6169080.html
Copyright © 2020-2023  润新知