向服务器提交数据

导语

有时你需要通过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();
        }
    }

转载于:https://www.cnblogs.com/xidongyu/p/6169080.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值