Android網絡編程之Http通信

程序員小顧 2021-11-25 17:16:45
android 程之 http 通信

  Android中提供的HttpURLConnection和HttpClient接口可以用來開發HTTP程序。以下是本人在學習中的總結與歸納。
1. HttpURLConnection接口
    首先需要明確的是,Http通信中的POST和GET請求方式的不同。GET可以獲得靜態頁面,也可以把參數放在URL字符串後面,傳遞給服務器。而POST方法的參數是放在Http請求中。因此,在編程之前,應當首先明確使用的請求方法,然後再根據所使用的方式選擇相應的編程方式。
    HttpURLConnection是繼承於URLConnection類,二者都是抽象類。其對象主要通過URL的openConnection方法獲得。創建方法如下代碼所示:

1.URL url = new URL("http://www.51cto.com/index.jsp?par=123456");  
2. HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); 

通過以下方法可以對請求的屬性進行一些設置,如下所示:

1. //設置輸入和輸出流  
2. urlConn.setDoOutput(true);  
3. urlConn.setDoInput(true);  
4. //設置請求方式為POST  
5. urlConn.setRequestMethod("POST");  
6. //POST請求不能使用緩存  
7. urlConn.setUseCaches(false);  
8. //關閉連接  
9. urlConn.disConnection();  

HttpURLConnection默認使用GET方式,例如下面代碼所示:

1. //使用HttpURLConnection打開連接  
2.HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
3. //得到讀取的內容(流)  
4.InputStreamReader in = new InputStreamReader(urlConn.getInputStream());  
5. // 為輸出創建BufferedReader  
6. BufferedReader buffer = new BufferedReader(in); 7. String inputLine = null;  
8. //使用循環來讀取獲得的數據  
9. while (((inputLine = buffer.readLine()) != null))  
10. {  
11. //我們在每一行後面加上一個"\n"來換行  
12. resultData += inputLine + "\n";  
13. }           
14. //關閉InputStreamReader  
15. in.close();  
16. //關閉http連接  
17. urlConn.disconnect(); 

如果需要使用POST方式,則需要setRequestMethod設置。代碼如下:

1.String httpUrl = "http://192.168.1.110:8080/httpget.jsp";  
2. //獲得的數據  
3. String resultData = "";  
4. URL url = null;  
5. try 
6. {  
7. //構造一個URL對象  
8. url = new URL(httpUrl);   
9. }  
10. catch (MalformedURLException e)  
11. {  
12. Log.e(DEBUG_TAG, "MalformedURLException");  
13. }  
14. if (url != null)  
15. {  
16. try 
17. {  
18. // 使用HttpURLConnection打開連接  
19. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
20. //因為這個是post請求,設立需要設置為true  
21. urlConn.setDoOutput(true);  
22. urlConn.setDoInput(true);  
23. // 設置以POST方式  
24. urlConn.setRequestMethod("POST");  
25. // Post 請求不能使用緩存  
26. urlConn.setUseCaches(false);  
27. urlConn.setInstanceFollowRedirects(true);  
28. // 配置本次連接的Content-type,配置為application/x-www-form-urlencoded的  
29. urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
30. // 連接,從postUrl.openConnection()至此的配置必須要在connect之前完成,  
31. // 要注意的是connection.getOutputStream會隱含的進行connect。  
32. urlConn.connect();  
33. //DataOutputStream流  
34.DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());  
35. //要上傳的參數  
36.String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312");  
37. //將要上傳的內容寫入流中  
38. out.writeBytes(content);   
39. //刷新、關閉  
40. out.flush();  
41. out.close();  

2. HttpClient接口    
使用Apache提供的HttpClient接口同樣可以進行HTTP操作。
    對於GET和POST請求方法的操作有所不同。GET方法的操作代碼示例如下:

1. // http地址  
2.String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";  
3. //HttpGet連接對象  
4. HttpGet httpRequest = new HttpGet(httpUrl);  
5. //取得HttpClient對象  
6. HttpClient httpclient = new DefaultHttpClient();  
7. //請求HttpClient,取得HttpResponse  
8.HttpResponse httpResponse = httpclient.execute(httpRequest);  
9. //請求成功  
10.
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)  
11. {  
12. //取得返回的字符串  
13. String strResult = EntityUtils.toString(httpResponse.getEntity());  
14. mTextView.setText(strResult);  
15. }  
16. else 
17. {  
18. mTextView.setText("請求錯誤!");  
19. }  
20. } 

使用POST方法進行參數傳遞時,需要使用NameValuePair來保存要傳遞的參數。,另外,還需要設置所使用的字符集。代碼如下所示:

1. // http地址  
2. String httpUrl = "http://192.168.1.110:8080/httpget.jsp";  
3. //HttpPost連接對象  
4. HttpPost httpRequest = new HttpPost(httpUrl);  
5. //使用NameValuePair來保存要傳遞的Post參數  
6. List<NameValuePair> params = new ArrayList<NameValuePair>();  
7. //添加要傳遞的參數  
8. params.add(new BasicNameValuePair("par", "HttpClient_android_Post"));  
9. //設置字符集  
10. HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");  
11. //請求httpRequest  
12. httpRequest.setEntity(httpentity);  
13. //取得默認的HttpClient  
14. HttpClient httpclient = new DefaultHttpClient();  
15. //取得HttpResponse  
16. HttpResponse httpResponse = httpclient.execute(httpRequest);  
17. //HttpStatus.SC_OK錶示連接成功  
18.
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)  
19. {  
20. //取得返回的字符串  
21. String strResult = EntityUtils.toString(httpResponse.getEntity());  
22. mTextView.setText(strResult);  
23. }  
24. else 
25. {  
26. mTextView.setText("請求錯誤!");  
27. }  
28. } 

HttpClient實際上是對Java提供方法的一些封裝,在HttpURLConnection中的輸入輸出流操作,在這個接口中被統一封裝成了HttpPost(HttpGet)和HttpResponse,這樣,就减少了操作的繁瑣性。

另外,在使用POST方式進行傳輸時,需要進行字符編碼。

版权声明
本文为[程序員小顧]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125171540540e.html

  1. 应急响应入门之Linux分析排查
  2. Twitter如何升级Hadoop+Kafka架构实现实时处理数十亿个事件?
  3. 引人入胜,实战讲解“Java性能调优六大工具”之linux命令行工具
  4. docker 查看实时日志
  5. JFrog Artifactory 7.27 上传应用到私服和从maven私服下载制品
  6. Ces protocoles http simples
  7. [including thesis + source code] JavaWeb hospital triage registration management system SSH [package running successfully]
  8. Java初学者,想知道如何用if语法当条件成立后什么都不执行,否则执行动作
  9. 体验.NET Core使用IKVM对接Java
  10. 深入JavaScript高级语法-coderwhy
  11. 排序算法--Java实例/原理
  12. 停止docker时报错:Warning: Stopping docker.service, but it can still be activated by: docker.socket
  13. 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s
  14. 【Linux】腾讯云服务器,使用FRP内网穿透,端口映射,远程访问内网ubuntu机器
  15. 关于#java#的问题:resultMap type映射不到我想要的类 只能映射java的内部类 加了全路径也映射不了 怎么解决
  16. 排序算法--Java實例/原理
  17. 就这一次,阿里最新出品源码阅读指南,一套搞定JDK+vm源码
  18. 两个小时手写了个Zookeeper分布式服务注册中心
  19. Algorithme de tri - - instance / principe Java
  20. Plongez dans la syntaxe avancée javascript - coderwhy
  21. JavaScript高级程序设计读后感(一)之零碎知识点查漏补缺
  22. 先到先学!Alibaba甩出第四次更新的JDK源码高级笔记(终极版)
  23. Java File类
  24. How To Install MariaDB on linux
  25. #yyds干货盘点# Mybatis 的 XML 配置
  26. Spring认证中国教育管理中心-Spring Data MongoDB教程七
  27. Linux进程和任务管理
  28. Linux文件系统日志分析
  29. Redis-客户端-重点知识
  30. Redis-事件-重点知识
  31. Redis-AOF持久化-重点知识
  32. Redis-RDB持久化-重点知识
  33. http://lx.gongxuanwang.com/sszt/32.htm
  34. 回顾我两个月面试阿里,携程,小红书,美团,网易等等(Java岗)
  35. JavaScript高级程序设计读后感(一)之零碎知识点查漏补缺
  36. Rocketmq source code analysis: message sending process
  37. Rocketmq source code analysis: how does rocketmq store messages?
  38. RocketMQ source analysis: how to debug the RocketMQ source in IDEA
  39. How To Install MariaDB on linux
  40. Comment installer mariadb sur Linux
  41. http://lx.gongxuanwang.com/sszt/7.htm
  42. Classe de fichiers Java
  43. Premier arrivé, premier servi! Alibaba lance la quatrième mise à jour de JDK source Advanced notes (Ultimate)
  44. #yyds干货盘点#设计模式之【工厂模式】
  45. Java * SpringBoot实现万能文件在线预览,已开源,真香
  46. Redis | 第4章 Redis中的数据库《Redis设计与实现》
  47. Liang Tingwei's first variety show of "director, please give advice" reshapes the classic work "spring of a new town"
  48. Redis | 第4章 Redis中的数据库《Redis设计与实现》
  49. 关于centos docker版本过低导致 is not a valid repository/tag: invalid reference format
  50. Redis 源码简洁剖析 02 - SDS 字符串
  51. 回顧我兩個月面試阿裏,攜程,小紅書,美團,網易等等(Java崗)
  52. Rétrospectivement, j'ai passé deux mois à interviewer Ali, ctrip, Little Red Book, meituan, NetEase, etc. (Java post)
  53. Docker + webhook Automation Deployment Front End Project
  54. Java技术之Spring、Hibernate框架整合方法
  55. http://lx.gongxuanwang.com/sszt/32.htm
  56. 亚马逊自己的 Linux 发行版现在完全基于 Fedora 了
  57. Redis 源码简洁剖析 02 - SDS 字符串
  58. Java技術之Spring、Hibernate框架整合方法
  59. Méthode d'intégration des cadres de printemps et d'hibernation de la technologie Java
  60. Redis source Concise Analysis 02 - SDS String