java 的http請求方式:HttpURLConnection和HttpClient


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM