1、要了解一些概念性的東西,比如Http的協議以及協議頭等一些東東
2、HttpURLConnection一般步驟:創建URL對象==》獲取URL的HttpURLConnection對象實例==》設置HTTP請求使用的方法==》設置超時和消息頭==》對服務器響應碼判斷==》獲得服務器返回的輸入流==》關掉HTTP連接
2.1、GET請求示例
//創建URL對象,xxx是服務器API URL url = new URL("xxx"); //調用URL對象的openConnection( )來獲取HttpURLConnection對象實例 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //請求方法為GET conn.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是服務器API URL url = new URL("xxx"); //調用URL對象的openConnection( )來獲取HttpURLConnection對象實例 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //請求方法為GET conn.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