当前位置: 首页 > news >正文

安卓App使用HttpURLConnection发送请求与上传文件

安卓原生App开发时常用的http开发工具

  • 系统内置http请求工具为 HttpURLConnection
  • httpClient 是 apache 的开源工具
  • okHttp 使用更简单,语法相对HttpURLConnection也简洁了许多,需要在graddle添加依赖。

本文主要讲解如何使用HttpURConnection向服务器发送Reqest, 保存Response内容,如何上传文件等内容。

1. 使用 HttpURLConnection 发送http GET请求

step-1: 创建1个URL 对象

URL url = new URL("http://www.yahoo.com");

step-2: 创建1个 HttpURLConnection对象,并绑定URL对象 object,

HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();

step-3: 设置请求方法,以及其它必要选项

httpConn.setConnectTimeout(10000);
httpConn.setRequestMethod("GET");

设置了请求方法后,就开始发送

step-4: 读取 Response
在httpConn对象上打开1个input stream, 用BufferReader的方式从httpConnect中读字节

InputStream inputStream = httpConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//保存response内容
StringBuffer readTextBuf = new StringBuffer();
String line = bufferedReader.readLine();
while(line != null) {readTextBuf.append(line);// Continue to read text line.line = bufferedReader.readLine();
}

step-5: 读完response以后,此连接就不需要了,别忘了关闭连接

httpConn.disconnect();

2. 发送 POST请求步骤

与GET请求步骤不同在于,POST 需要在消息体内携带请求参数,因此要在httpConn连接上打开ouput stream,才能发出
将第1节的step-3 改为如下:

httpConn.setRequestMethod("GET");
httpConn.setRequestProperty(Key,Value);
httpConn.setDoOutput(true);Output the stream to the server
OutputStream outputPost = new BufferedOutputStream(httpConn.getOutputStream());
writeStream(outputPost);
outputPost.flush();
outputPost.close();

至此,POST消息发送完成。 读取Response响应体的方法与上节相同。

下面是1个完整的发送POST 示例
(1)准备1个HashMap(类似于python字典)保存请求参数
HashMap<String, String> params;
//此处添加
params.put("name", "Jack");
params.put("company", "Baidu");

(2)将HashMap转为stringBuild类型

StringBuilder sbParams = new StringBuilder();int i = 0;for (String key : params.keySet()) {try {if (i != 0){sbParams.append("&");}sbParams.append(key).append("=").append(URLEncoder.encode(params.get(key), "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}i++;}

(3) 创建 HttpURLConnection 对象,打开连接,发送POST请求参数

try{String url = "http://www.example.com/test.php";URL urlObj = new URL(url);HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();conn.setDoOutput(true);conn.setRequestMethod("POST");conn.setRequestProperty("Accept-Charset", "UTF-8");conn.setReadTimeout(10000);conn.setConnectTimeout(15000);conn.connect();String paramsString = sbParams.toString();  //sbParams是前面准备好的DataOutputStream wr = new DataOutputStream(conn.getOutputStream());wr.writeBytes(paramsString);wr.flush();wr.close();
} catch (IOException e) {e.printStackTrace();
}

(4)接收response, 保存body 内容

try {InputStream in = new BufferedInputStream(conn.getInputStream());BufferedReader reader = new BufferedReader(new InputStreamReader(in));StringBuilder result = new StringBuilder();String line;while ((line = reader.readLine()) != null) {result.append(line);}Log.d("test", "result from server: " + result.toString());} catch (IOException e) {e.printStackTrace();
} finally {if (conn != null) {conn.disconnect();}
}

3. 发送Json POST request

与普通的POST请求不同,JSON POST请求参数为json格式, 因此需要修改请求头部参数Content-Type与Accept参数

修改step-3步骤:

httpConn.setRequestMethod("POST");

设置Content-Type头部参数为“application/json”

httpConn.setRequestProperty("Content-Type", "application/json");

设置“Accept”头部参数为“application/json”

httpConn.setRequestProperty("Accept", "application/json");

设置连接准备发送数据

httpConn.setDoOutput(true);

创建1个json body

String jsonInputString = "{"name": "Upendra", "job": "Programmer"}";

将json字符串写入output stream

try(OutputStream os = httpConn.getOutputStream()) {byte[] input = jsonInputString.getBytes("utf-8");os.write(input, 0, input.length); 
}

4. 用POST请求上传文件

上传文件时,POST请求头部参数Content-Type使用 multipart/form-data, 实现也比较容易

URL url = new URL(postTarget);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();String auth = "Bearer " + oauthToken;
connection.setRequestProperty("Authorization", basicAuth);String boundary = UUID.randomUUID().toString();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);DataOutputStream request = new DataOutputStream(uc.getOutputStream());request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"description\"\r\n\r\n");
request.writeBytes(fileDescription + "\r\n");request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.fileName + "\"\r\n\r\n");
request.write(FileUtils.readFileToByteArray(file));
request.writeBytes("\r\n");request.writeBytes("--" + boundary + "--\r\n");
request.flush();
int respCode = connection.getResponseCode();switch(respCode) {case 200://all went ok - read response...break;case 301:case 302:case 307://handle redirect - for example, re-post to the new location...break;...default://do something sensible
}

总结

使用 HttpURLConnection 发送请求流程还是比较清晰,GET, POST,主要的区别在Step-3 步骤,发送 JSON类型参数,上传 file 还需要修改头部参数。
在Android App开发时,可以在Activity用按钮事件来触发请求,也可以使用service 在后台发送请求。 本文就不列出那些示例代码了。

相关文章:

安卓App使用HttpURLConnection发送请求与上传文件

安卓原生App开发时常用的http开发工具 系统内置http请求工具为 HttpURLConnectionhttpClient 是 apache 的开源工具okHttp 使用更简单&#xff0c;语法相对HttpURLConnection也简洁了许多&#xff0c;需要在graddle添加依赖。 本文主要讲解如何使用HttpURConnection向服务器发…...

【Linux服务端搭建及使用】

连接服务器的软件&#xff1a;mobaxterm 设置root 账号 sudo apt-get install passwd #安装passwd 设置方法 sudo passwd #设置root密码 su root #切换到root账户设置共享文件夹 一、强制删除原有环境 1.删除python rpm -qa|grep pytho…...

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(三)

思维导图 1.编程思想 1.1 面向过程编程 1.2 面向对象编程 (oop) 2. 构造函数 3. 原型 3.1 原型 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IE…...

Linux 指令心法(十一)`tail` 显示文本文件的末尾部分

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 tail 是一个用于显示文本文件的末尾部分的命令。它在 Linux 和 Unix 系统中非常有用&#xff0c;因为它允许用户查看文件的最后几行&#xff0c;以便实时监视…...

Mac mov转mp4,详细转换步骤

Mac mov转mp4怎么转&#xff1f;视频文件格式为.mov是由Apple公司所开发的特殊格式。因其只能在苹果设备上播放&#xff0c;与他人分享时就会变得困难。为此&#xff0c;我们通常会选择使用MP4这种最受欢迎的视频格式。在日常使用中&#xff0c;MP4成为了大家首选的视频格式。而…...

高级深入--day31

Item Pipeline 当Item在Spider中被收集之后&#xff0c;它将会被传递到Item Pipeline&#xff0c;这些Item Pipeline组件按定义的顺序处理Item。 每个Item Pipeline都是实现了简单方法的Python类&#xff0c;比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用&…...

一文讲解图像梯度

简介&#xff1a; ​ 图像梯度计算的是图像变化的幅度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值变化也较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化较小&#xff0c;相应的梯度值变化也较小。一般情…...

湖州OLED透明拼接屏技术应用引领现代化旅游观光方式

湖州市位于中国浙江省北部&#xff0c;拥有悠久的历史和丰富的文化遗产。湖州市以其美丽的湖泊和秀丽的自然风光而闻名。 作为中国重要的历史文化名城之一&#xff0c;湖州市有着丰富的文化遗产和历史资源&#xff0c;如古城墙、古建筑和古镇等。 这为OLED透明拼接屏技术的应用…...

点云从入门到精通技术详解100篇-点云特征学习模型及其在配准中的应用(续)

目录 基于局部邻域的点云特征学习模型 3.1引言 3.2自适应邻域选择算法...

铁道交通运输运营3D模拟仿真实操提供一个沉浸、高效且环保的情境

VR模拟果蔬运输应急处理场景在农产品物流行业中具有重要的意义。这种模拟技术为农产品运输提供了全新的、更高效和更安全的方式来模拟真实世界的应急情况&#xff0c;帮助操作人员、研究者和管理者更好地理解和应对可能的运输风险措施。 VR模拟果蔬运输应急处理场景可以模拟出各…...

yum apt pip 阿里云源

centos yum 阿里云源 # 备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup# centos 6 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo curl -o /etc/yum.repos.d/CentOS-Base.repo h…...

Python+Tkinter 图形化界面基础篇:多线程和异步编程

PythonTkinter 图形化界面基础篇&#xff1a;多线程和异步编程 引言为什么需要多线程和异步编程&#xff1f;使用多线程多线程示例步骤 1 &#xff1a;导入必要的模块步骤 2 &#xff1a;创建主窗口和按钮步骤 3 &#xff1a;创建下载线程步骤 4 &#xff1a;启动主事件循环 使…...

第13章 并发编程高阶(二)

13.11 Reentrantlock和Synchronized有哪些区别 难度:★★ 重点:★★ 白话解析 继续串线,搞明白了锁的设计,那Java设计的Reentrantlock锁和JVM底层的synchronized锁到底有什么区别呢。 参考答案 1、底层实现层面 synchronized 是JVM层面的锁,是Java关键字 reentrantlock…...

Android AMS——栈管理详解(十一)

上一篇我们找到了栈管理所在的方法,这里继续对内部方法进行详细分析。 setInitialState:初始化函数。 computeLaunchingTaskFlags:检查 Activity 的启动模式。 computeSourceRootTask:处理源 Activity 的所在栈。 getReusableTask:获取能够复用的 Task。 computeTargetTas…...

【Redis】Set集合相关的命令

目录 命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREMSINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令 SADD 将⼀个或者多个元素添加到set中。注意&#xff0c;重复的元素⽆法添加到set中。 SADD key member [member ...]SMEMBERS 获取⼀个set中的所有元素&#xff0…...

力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)

题目 501. 二叉搜索树中的众数 简单 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 …...

MARKDOWN 文档图片编码嵌入方案

#1 写在前面 开始写这篇文章时&#xff0c;标题怎么定困扰我良久&#xff0c;缘于不晓得如何给接下来要做的事定个简单明了的标题&#xff1a;在&#x1f4f1;终端只能纯文本交互的前提下&#xff0c;优雅展示 markdown 文档中的图片。这也许比问题本身还要棘手&#x1f604;。…...

KubeVela可持续测试应用部署之Mock基础设施

Mock接口是我们常用的功能测试方案,有时候依赖的接口未开发完成或者依赖的第三方接口不提供测试环境等,只有Mock才能跑通流程。 我们基于KubeVela开发的云原生应用交付平台,提供如初始化基础设施导入、中间件部署共用基础设施等相关能力的测试,需要依赖基础设施。虽然terr…...

代理IP、Socks5代理与网络工程:解析技术世界的无限可能

在当今数字化的世界中&#xff0c;网络工程师不仅需要保证网络的稳定性&#xff0c;还要应对多样的技术挑战。代理IP和Socks5代理技术已经成为网络工程师工具箱中不可或缺的利器&#xff0c;在跨界电商、爬虫、出海、网络安全、游戏等领域发挥关键作用。本文将深入探讨这两项技…...

OpenCV级联分类器识别车辆实践笔记

1. OpenCV 级联分类器的基本原理 基于Haar特征的级联分类器的目标检测是Paul Viola和Michael Jones在2001年的论文中提出的一种有效的目标检测方法。这是一种基于机器学习的方法&#xff0c;从大量的正面和负面图像中训练级联函数。然后用它来检测其他图像中的物体。 Haar特征…...

VS编译的时候不生成Release文件夹

方法描述&#xff1a; Build>Configuration Manager>Release 编译》配置管理》选择发布版本 再编译就有了 具体操作过程 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 特此记录 anlog 2023年10月12日...

14.2 Socket 反向远程命令行

在本节&#xff0c;我们将继续深入探讨套接字通信技术&#xff0c;并介绍一种常见的用法&#xff0c;实现反向远程命令执行功能。对于安全从业者而言&#xff0c;经常需要在远程主机上执行命令并获取执行结果。本节将介绍如何利用 _popen() 函数来启动命令行进程&#xff0c;并…...

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 离散点云重建为mesh网格模型,并保存到PLY文件中,用于其他软件打开查看,代码非常简短,复制粘贴即可迅速上手使用,具体参数根据自己的点云数据…...

CSS 中::after的妙用(实现在margin中显示内容)

效果图如下&#xff1a; 背景&#xff1a; 如上图&#xff0c;之前只是当纯的写一个参考货架平面图&#xff0c;用作物料系统的在库状态可视化&#xff0c;当完成页面body分成10等份时&#xff0c;货架之间需要有通道&#xff0c;为了实现实际的样式&#xff0c;我给每个等份都…...

SentenceTransformer使用多GPU加速向量化

文章目录 前言代码 前言 当我们需要对大规模的数据向量化以存到向量数据库中时&#xff0c;且服务器上有多个GPU可以支配&#xff0c;我们希望同时利用所有的GPU来并行这一过程&#xff0c;加速向量化。 代码 就几行代码&#xff0c;不废话了 from sentence_transformers i…...

架构师-软件工程习题选择题

架构师-软件工程习题选择题 真题案例题 真题 c 瀑布模型&#xff1a;针对软件需求明确的情况&#xff0c;将前一个阶段做完&#xff0c;才能开始下一个阶段 原型模型&#xff1a;针对需求不明确的情况&#xff0c;快速搭建出系统原型&#xff0c;然后根据系统原型和客户确认需求…...

springboot单独在指定地方输出sql

一般线上项目都是将日志进行关闭&#xff0c;因为mybatis日志打印&#xff0c;时间长了&#xff0c;会占用大量的内存&#xff0c;如果我想在我指定的地方进行打印sql情况&#xff0c;怎么玩呢&#xff01; 下面这个场景&#xff1a; 某天线上的项目出bug了&#xff0c;日志打印…...

gpio内部结构(一)

一&#xff0c;GPIO内部结构 1&#xff0c;保护二极管 * 引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入。 * 当引脚电压高于 VDD_FT 或 VDD 时&#xff0c;上方的二极管导通吸收这个高电压。 * 当引脚电压低于 VSS 时&#xff0c;下方的二极管导通&…...

【C++14保姆级教程】变量模板,Labmda泛型

文章目录 前言一、变量模板&#xff08;Variable Templates&#xff09;1.1 变量模板是什么1.2 泛型大概使用1.3 示例代码11.4 示例代码21.5 示例代码3 二、Lambda泛型&#xff08;Lambda Generics&#xff09;2.1 Lambda表达式泛型是什么&#xff1f;2.2 函数原型怎么写&#…...

LLM - 旋转位置编码 RoPE 代码详解

目录 一.引言 二.RoPE 理论 1.RoPE 矩阵形式 2.RoPE 图例形式 3.RoPE 实践分析 三.RoPE 代码分析 1.源码获取 2.源码分析 3.rotary_emb 3.1 __init__ 3.2 forward 4.apply_rotary_pos_emb 4.1 rotate_half 4.2 apply_rotary_pos_emb 四.RoPE 代码实现 1.Q/K/V …...