使用URLConnection實現post表單提交
阿新 • • 發佈:2019-01-07
首先介紹下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,看核心原理是否是這樣的。