Android 网络请求(一)初识HTTP网络通信

学习笔记

代码样例

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionExample {

     public String getDataFromServer() {
        String result = ""; // 存储请求返回的响应数据
        HttpURLConnection urlConnection = null; // 用于处理 HTTP 连接
        BufferedReader reader = null; // 用于读取响应数据
        try {
            // 创建 URL 对象,传入目标 URL 地址
            URL url = new URL("https://jsonplaceholder.typicode.com/posts");
            // 打开 HTTP 连接
            urlConnection = (HttpURLConnection) url.openConnection();
            // 设置请求方法为 GET
            urlConnection.setRequestMethod("GET");
            // 设置请求头(可选,取决于服务器的需求)
            urlConnection.setRequestProperty("Content-Type", "application/json");
            // 设置连接超时和读取超时,防止请求卡住
            urlConnection.setConnectTimeout(5000); // 设置连接超时 5 秒
            urlConnection.setReadTimeout(5000);    // 设置读取超时 5 秒
            // 获取响应码,检查是否请求成功
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { // 200 表示请求成功
                // 创建输入流读取服务器响应的数据
                reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                String line;
                StringBuilder response = new StringBuilder(); // 用 StringBuilder 存储响应内容
                // 按行读取响应数据
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                // 将响应数据存储在 result 变量中
                result = response.toString();
            } else {
                // 请求失败,返回错误信息
                result = "Request failed with response code: " + responseCode;
            }
        } catch (Exception e) {
            // 捕获异常并打印堆栈信息
            e.printStackTrace();
            result = "Error: " + e.getMessage();
        } finally {
            // 关闭输入流和连接
            try {
                if (reader != null) {
                    reader.close();
                }
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 返回响应数据或错误信息
        return result;
    }
}

代码解释:

 1. 创建 HttpURLConnection 连接

URL url = new URL("https://jsonplaceholder.typicode.com/posts");
urlConnection = (HttpURLConnection) url.openConnection();
  • 使用 new URL() 创建 URL 对象。

  • 使用 openConnection() 方法打开一个连接。返回值是 HttpURLConnection 类型,我们可以通过这个对象设置请求方法和头信息等。

2. 设置请求方法和请求头

urlConnection.setRequestMethod("GET");
urlConnection.setRequestProperty("Content-Type", "application/json");
  • setRequestMethod("GET"):设置请求方式为 GET,这表示从服务器获取数据。

  • setRequestProperty("Content-Type", "application/json"):设置请求头,指定请求的内容类型为 JSON。根据服务器的要求,这一步可选。

3. 设置超时

urlConnection.setConnectTimeout(5000); // 设置连接超时 5 秒
urlConnection.setReadTimeout(5000);    // 设置读取超时 5 秒
  • setConnectTimeout(5000):设置连接超时为 5 秒。如果超过这个时间仍无法连接,则会抛出 SocketTimeoutException

  • setReadTimeout(5000):设置读取超时为 5 秒。如果在这个时间内没有从服务器读取到数据,也会抛出 SocketTimeoutException

4. 获取响应码并读取响应数据

int responseCode = urlConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
    // 请求成功,读取数据
    reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
    String line;
    StringBuilder response = new StringBuilder();
    while ((line = reader.readLine()) != null) {
        response.append(line);
    }
    result = response.toString();
} else {
    // 请求失败
    result = "Request failed with response code: " + responseCode;
}
  • getResponseCode() 获取服务器返回的 HTTP 状态码。如果返回 200(HTTP_OK),表示请求成功。

  • 通过 urlConnection.getInputStream() 获取响应的输入流,读取服务器返回的数据。

  • 使用 BufferedReader 按行读取响应内容,并使用 StringBuilder 将其拼接成一个完整的字符串。

5. 关闭流和连接

if (reader != null) {
    reader.close();
}
if (urlConnection != null) {
    urlConnection.disconnect();
}
  • finally 块中关闭 BufferedReaderHttpURLConnection,以确保资源被释放,避免内存泄漏。

6. 异常处理

catch (Exception e) {
    e.printStackTrace();
    result = "Error: " + e.getMessage();
}
  • 捕获异常,并输出错误信息。
  • 返回错误消息。

异步请求

在 Android 开发中,不能在主线程执行网络请求,因为这会导致 ANR(应用无响应)错误。所以需要在子线程中执行网络请求。

new Thread(new Runnable() {
    @Override
    public void run() {
        String result = getDataFromServer(); // 调用上面的方法进行网络请求
        // 在此处处理返回的数据
    }
}).start();

总结

  • HttpURLConnection 是 Java 提供的低级别 HTTP 客户端,用于发送 HTTP 请求并接收响应。

  • 通过 setRequestMethod() 设置请求类型,getResponseCode() 获取响应状态码,getInputStream() 获取响应数据。

  • 必须在子线程中执行网络请求,避免阻塞主线程。

  • 需要手动管理超时设置、请求头、连接关闭等。

尽管 HttpURLConnection 是 Android 内置的网络库,但它相对较为底层,开发者需要手动处理一些细节。如果需要更高级的功能,建议使用 OkHttpRetrofit 等库,这些库提供了更简洁的 API 和更强的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言安装PHP稳定版本线程安全版解压使用 PHP配置配置文件扩展文件路径…

Docker安装RabbitMq详细教程

1.1通过Docker pull RabbitMq docker pull rabbitmq 1.2 获取镜像 docker images 注:执行1.3之前请使用以下命令创建docker网络 docker network create tm 1.3运行命令启动参数 docker run \-e RABBITMQ_DEFAULT_USERrabbitmq \-e RABBITMQ_DEFAULT_PASSrabbitm…

华为ENSP--IP编址及静态路由配置

项目拓扑 项目任务 一、基础配置和IP编址 在AR1、AR2、AR3上配置设备名称和IP地址 # AR1配置 [AR1]interface GigabitEthernet 0/0/0 [AR1-GigabitEthernet0/0/0]ip address 10.0.13.1 24 [AR1-GigabitEthernet0/0/0]q [AR1]interface GigabitEthernet 0/0/1 [AR1-GigabitEth…

老北京香酥芝麻饼

宝安石岩上屋大道有一家老北京香酥芝麻饼,不仅很好吃,还分量特别厚实。应该这家老店,在上屋大道很多人知道和吃过。我每周末都会去买回去给家人一起吃。工作日由于上下班,想买也买不了,因为太晚去老板就收摊了。就像早…

对于相对速度的重新理解 - 2

回到先前说的,先令真空光速为标准光速, 光子的绝对速度 范围, 物质粒子的 范围, 这样的话,我们就可以根据 和 ,把速度分成3个段, 这样就可以出现速度和它的负值,也就是速度的矢量具…

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解 目录 GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GWO-SVMD灰狼算法优化逐次变分模态分解 内有15种用以优化svmd的适应度函数&#…

初识Linux—— 基本指令(下)

前言: 本篇继续来学习Linux的基础指令,继续加油!!! 本篇文章对于图片即内容详解,已同步到本人gitee:Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat ​ cat 查看文件…

在SQLyog中导入和导出数据库

导入 假如我要导入一个xxx.sql,我就先创建一个叫做xxx的数据库。 然后右键点击导入、执行SQL脚本 选择要导入的数据库文件的位置,点击执行即可 注意: 导入之后记得刷新一下导出 选择你要导出的数据库 右键选择:备份/导出、…

如何进行高级红队测试:OpenAI的实践与方法

随着人工智能(AI)技术的迅猛发展,AI模型的安全性和可靠性已经成为业界关注的核心问题之一。为了确保AI系统在实际应用中的安全性,红队测试作为一种有效的安全评估方法,得到了广泛应用。近日,OpenAI发布了两…

ES 基本使用与二次封装

概述 基本了解 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它提供了对海量数据的快速全文搜索、结构化搜索和分析功能,是目前流行的大数据处理工具之一。主要特点即高效搜索、分布式存储、拓展性强 核心功能 全文搜索:…

Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着儿童娱乐与教育需求的…

Python安装出现严重错误的解决方法_0x80070643-安装时发生严重错误

使用这个软件MicrosoftProgram_Install_and_Uninstall.meta.diagcab把关于Python一个个组件全部删除,然后就能够重新安装Python了 修复阻止程序安装或删除的问题 - Microsoft 支持 这里下载

Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化

一、背景 线上程序连接mongos超时,mongo监控显示连接数已使用100%。 java程序报错信息: org.mongodb.driver.connection: Closed connection [connectionId{localValue:1480}] to 192.168.10.16:3717 because there was a socket exception raised by…

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程 引言 微信小程序作为一种新兴的轻量级应用,凭借其便捷性和丰富的功能受到了广泛的欢迎。在开发小程序的过程中,合理配置全局属性是提升用户体验的关键。本文将深入探讨小程序的全局配置中的window选项,重点介绍导…

YOLOv11融合[ECCV 2018]RCAN中的RCAB模块及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Image Super-Resolution Using Very Deep Residual Channel Attention Networks》 一、 模块介绍 论文链接:https://arxiv.org/abs/1807…

linux ubuntu的脚本知

目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 N、其它可以参考的网址 脚本功能强大,用起来也…

前端:JavaScript (学习笔记)【2】

目录 一,数组的使用 1,数组的创建 [ ] 2,数组的元素和长度 3,数组的遍历方式 4,数组的常用方法 二,JavaScript中的对象 1,常用对象 (1)String和java中的Stri…

【Git】工作区、暂存区和版本库

目录 一、基本概念: 关系图: 1. 工作区(Working Directory) $ 1.1 工作区功能 $ 1.2 工作区特点 2. 暂存区(Staging Area) $ 2.1 暂存区功能 $ 2.2 暂存区特点 $ 2.3 常用命令 3. 版本库&#xff08…

【Linux | 计网】TCP协议详解:从定义到连接管理机制

目录 1.TCP协议的定义: 2.TCP 协议段格式 3.TCP两种通信方式 4.确认应答(ACK)机制 解决“后发先至”问题 5.超时重传机制 那么, 超时的时间如何确定? 6.连接管理机制: 6.1.三次握手: 为什么需要3次握手,一次两次不行吗…

Springboot系列之:创建Springboot项目,Springboot整合MyBatis-plus

Springboot系列之:创建Springboot项目,Springboot整合MyBatis-plus 一、快速创建Spring boot项目二、项目完整目录三、pom.xml四、application.yaml五、实体类六、mapper七、IService接口八、Service实现类九、配置类十、枚举十一、增删改查测试类十二、…