java 的http請求方式:HttpURLConnection和HttpClient,
1、要瞭解一些概念性的東西,比如Http的協議以及協議頭等一些東東
2、HttpURLConnection一般步驟:建立URL對象==》擷取URL的HttpURLConnection對象執行個體==》設定HTTP請求使用的方法==》設定逾時和訊息頭==》對伺服器響應碼判斷==》獲得伺服器返回的輸入資料流==》關掉HTTP串連
2.1、GET請求樣本
//建立URL對象,xxx是伺服器APIURL url = new URL("xxx");//調用URL對象的openConnection( )來擷取HttpURLConnection對象執行個體HttpURLConnection conn = (HttpURLConnection) url.openConnection();//要求方法為GETconn.setRequestMethod("GET");//設定連線逾時為5秒conn.setConnectTimeout(5000);//伺服器返回東西了,先對響應碼判斷if (conn.getResponseCode() == 200) { //用getInputStream()方法獲得伺服器返回的輸入資料流 InputStream in = conn.getInputStream(); byte[] data = read(in); //流轉換為位元組,read()自己寫的是轉換方法 String html = new String(data, "UTF-8"); System.out.println(html); in.close();}
ps:上述步驟基於伺服器介面正常的前提下,當然異常要另外處理,要求標頭按實際需要設定,得到伺服器返回的輸入資料流後按需要轉換使用,另外有時候網路請求要開一條線程
2.2、POST請求:POST請求大體和GET一致,只是設定相關參數的時候要注意設定允許輸入、輸出,還有POST方法不能緩衝,要手動設定為false
//建立URL對象,xxx是伺服器APIURL url = new URL("xxx");//調用URL對象的openConnection( )來擷取HttpURLConnection對象執行個體HttpURLConnection conn = (HttpURLConnection) url.openConnection();//要求方法為GETconn.setRequestMethod("POST");//設定連線逾時為5秒conn.setConnectTimeout(5000);//允許輸入輸出conn.setDoInput(true);conn.setDoOutput(true);//不能緩衝conn.setUseCaches(false);//至少要設定的兩個要求標頭conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");//輸出資料流包含要發送的資料,要注意資料格式編碼OutputStream op=conn.getOutputStream();op.write(new String("name=zhylioooo").getBytes());//伺服器返回東西了,先對響應碼判斷if (conn.getResponseCode() == 200) { //用getInputStream()方法獲得伺服器返回的輸入資料流 InputStream in = conn.getInputStream(); byte[] data = read(in); //流轉換為位元組,read()是轉換方法 String html = new String(data, "UTF-8"); System.out.println(html); in.close();}
3、HttpClient的使用步驟:建立HttpClient對象==》建立Http請求對象(GET、POST不同)==》佈建要求參數==》執行請求==》擷取響應對象==》對響應對象處理==》關閉相應對象==》關閉HttpClient
3.1、GET
//建立httpclient對象 CloseableHttpClient httpclient = HttpClients.createDefault(); //建立GET對象 HttpGet httpget = new HttpGet("xxx");//xxx是伺服器API //執行請求 CloseableHttpResponse response = httpclient.execute(httpget); if(response.getStatusLine().getStatusCode()==200) { HttpEntity entity = response.getEntity(); //所需內容都在entity裡面,這裡可以對資料操作 String detail = EntityUtils.toString(entity,"UTF-8"); System.out.println(detail); } response.close(); httpclient.close();
如果需要參數,可以用URIBuilder
工具類來簡化
URI uri = new URIBuilder() .setScheme("https") .setHost("xxx") .setPath("/xxx") .setParameter("key1", "value1") .setParameter("key2", "value2") .build();HttpGet httpget = new HttpGet(uri);
3.2、POST:POST一般用於提交一些特別的東西,內容多種多樣,HttpClient針對不同內容提供了不同的資料容器,如最常見的字串(StringEntity),位元組數組(ByteArrayEntity),輸入資料流(InputStreamEntity),和檔案(FileEntity),請注意InputStreamEntity
是不可重複的,因為它只能從底層資料流中讀取一次。一般建議實現一個自訂HttpEntity
類,而不是使用泛型InputStreamEntity
。 FileEntity
可以是一個很好的起點:
File file = new File("xxx.txt");FileEntity entity = new FileEntity(file, ContentType.create("text/plain", "UTF-8")); HttpPost httppost = new HttpPost("xxx");httppost.setEntity(entity);
POST最常見的提交表單資料:建立完HttpPost對象後,通過NameValuePair集合來儲存等待提交的參數,並將參數傳遞到UrlEncodedFormEntity中,最後調用setEntity(entity)完成, HttpClient.execute(HttpPost)即可:
List<NameValuePair> formparams = new ArrayList<NameValuePair>();formparams.add(new BasicNameValuePair("name", "zhylioooo"));formparams.add(new BasicNameValuePair("pswd", "123456"));UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);HttpPost httppost = new HttpPost("xxx");httppost.setEntity(entity);
4、一般實際開發很少自己寫HttpURLConnection和HttpClient,都是用別人封裝 好的第三方網路請求架構,例如:Volley,android-async-http,loopj等,因為網路操作涉及到 非同步以及多線程,自己動手寫的話很麻煩,所以實際開發還是直接用第三方。
5、HttpClient用到的jar包:https://pan.baidu.com/s/1gfjHi2B