Android开发:SOAP与REST WebService调用实战指南
1. Android调用WebService概述在Android开发中WebService是一种常见的远程服务调用方式。它基于SOAP协议或REST架构通过HTTP/HTTPS协议实现跨平台的数据交互。对于需要与企业级系统对接的移动应用来说WebService提供了标准化的集成方案。WebService的核心优势在于其平台无关性。无论后端系统是用Java、.NET还是其他语言开发只要遵循WebService标准Android客户端都能通过简单的HTTP请求与之通信。这种特性使其在ERP系统对接、支付网关集成等企业级应用中尤为常见。2. 准备工作与环境配置2.1 添加网络权限首先需要在AndroidManifest.xml中添加网络访问权限uses-permission android:nameandroid.permission.INTERNET /2.2 选择WebService调用方式Android平台主要支持两种WebService调用方式SOAP方式需要引入ksoap2-android库适合传统企业级WebService支持WSDL规范REST方式使用HttpURLConnection或OkHttp轻量级适合现代API设计通常返回JSON/XML格式数据对于传统SOAP WebService建议添加以下依赖implementation com.google.code.ksoap2-android:ksoap2-android:3.6.43. SOAP WebService调用实现3.1 构建SOAP请求以下是一个完整的SOAP请求示例private static final String NAMESPACE http://tempuri.org/; private static final String URL http://example.com/Service.asmx; private static final String METHOD_NAME GetData; private static final String SOAP_ACTION NAMESPACE METHOD_NAME; public void callWebService() { SoapObject request new SoapObject(NAMESPACE, METHOD_NAME); // 添加请求参数 request.addProperty(param1, value1); request.addProperty(param2, 123); SoapSerializationEnvelope envelope new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet true; // 针对.NET WebService的设置 envelope.setOutputSoapObject(request); HttpTransportSE transport new HttpTransportSE(URL); try { transport.call(SOAP_ACTION, envelope); SoapObject response (SoapObject) envelope.getResponse(); // 处理响应数据 processResponse(response); } catch (Exception e) { e.printStackTrace(); } }3.2 处理复杂类型响应当WebService返回复杂对象时需要注册映射关系// 在调用前添加 envelope.addMapping(NAMESPACE, User, new User().getClass()); // 自定义类示例 public class User implements KvmSerializable { private String name; private int age; // 必须实现的方法 Override public Object getProperty(int index) { switch(index) { case 0: return name; case 1: return age; } return null; } Override public void setProperty(int index, Object value) { switch(index) { case 0: name value.toString(); break; case 1: age Integer.parseInt(value.toString()); break; } } }4. REST WebService调用实现4.1 使用HttpURLConnection对于简单的REST服务可以使用系统原生APIpublic String callRestService(String urlStr) throws IOException { URL url new URL(urlStr); HttpURLConnection conn (HttpURLConnection) url.openConnection(); conn.setRequestMethod(GET); conn.setConnectTimeout(5000); try (InputStream is conn.getInputStream(); BufferedReader br new BufferedReader(new InputStreamReader(is))) { StringBuilder response new StringBuilder(); String line; while ((line br.readLine()) ! null) { response.append(line); } return response.toString(); } finally { conn.disconnect(); } }4.2 使用OkHttp推荐对于生产环境建议使用OkHttp库implementation com.squareup.okhttp3:okhttp:4.9.3调用示例public void callRestApiWithOkHttp() { OkHttpClient client new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build(); Request request new Request.Builder() .url(https://api.example.com/data) .addHeader(Authorization, Bearer token123) .build(); client.newCall(request).enqueue(new Callback() { Override public void onFailure(Call call, IOException e) { // 处理失败情况 } Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String jsonData response.body().string(); // 解析JSON响应 } } }); }5. 常见问题与解决方案5.1 网络请求主线程限制Android不允许在主线程执行网络操作解决方案使用AsyncTask已废弃但简单场景仍可用使用Thread Handler使用Kotlin协程使用RxJava协程示例KotlinlifecycleScope.launch { try { val result withContext(Dispatchers.IO) { callWebService() } // 更新UI } catch (e: Exception) { // 处理异常 } }5.2 超时与重试机制建议配置合理的超时和重试策略OkHttpClient client new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .retryOnConnectionFailure(true) .addInterceptor(new Interceptor() { Override public Response intercept(Chain chain) throws IOException { Request request chain.request(); Response response chain.proceed(request); int tryCount 0; while (!response.isSuccessful() tryCount 3) { tryCount; response chain.proceed(request); } return response; } }) .build();5.3 安全配置从Android 9(Pie)开始默认禁止明文HTTP请求解决方法使用HTTPS或配置网络安全策略(res/xml/network_security_config.xml)network-security-config domain-config cleartextTrafficPermittedtrue domain includeSubdomainstrueexample.com/domain /domain-config /network-security-config然后在Manifest中引用application android:networkSecurityConfigxml/network_security_config ... 6. 性能优化建议6.1 请求缓存对频繁请求且数据变化不频繁的接口实现缓存Cache cache new Cache(new File(context.getCacheDir(), http-cache), 10 * 1024 * 1024); OkHttpClient client new OkHttpClient.Builder() .cache(cache) .addInterceptor(new CacheInterceptor()) .build(); // 自定义缓存拦截器 class CacheInterceptor implements Interceptor { Override public Response intercept(Chain chain) throws IOException { Request request chain.request(); if (!isNetworkAvailable()) { request request.newBuilder() .header(Cache-Control, public, only-if-cached, max-stale 60 * 60 * 24) .build(); } return chain.proceed(request); } }6.2 数据压缩启用Gzip压缩减少传输数据量OkHttpClient client new OkHttpClient.Builder() .addInterceptor(new GzipRequestInterceptor()) .build(); class GzipRequestInterceptor implements Interceptor { Override public Response intercept(Chain chain) throws IOException { Request originalRequest chain.request(); Request compressedRequest originalRequest.newBuilder() .header(Accept-Encoding, gzip) .method(originalRequest.method(), gzip(originalRequest.body())) .build(); return chain.proceed(compressedRequest); } private RequestBody gzip(final RequestBody body) { return new RequestBody() { Override public MediaType contentType() { return body.contentType(); } Override public void writeTo(BufferedSink sink) throws IOException { BufferedSink gzipSink Okio.buffer(new GzipSink(sink)); body.writeTo(gzipSink); gzipSink.close(); } }; } }6.3 连接池优化复用HTTP连接提升性能ConnectionPool connectionPool new ConnectionPool(5, 10, TimeUnit.MINUTES); OkHttpClient client new OkHttpClient.Builder() .connectionPool(connectionPool) .build();7. 高级应用场景7.1 文件上传使用Multipart实现文件上传public void uploadFile(File file, String mimeType) { RequestBody requestBody new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart(file, file.getName(), RequestBody.create(file, MediaType.parse(mimeType))) .addFormDataPart(description, file upload) .build(); Request request new Request.Builder() .url(https://api.example.com/upload) .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { // 处理响应 }); }7.2 WebService安全认证对于需要认证的WebService添加安全头// Basic认证 String credential Credentials.basic(username, password); Request request new Request.Builder() .url(url) .header(Authorization, credential) .build(); // WS-Security认证SOAP SoapObject request new SoapObject(NAMESPACE, METHOD_NAME); Element[] header new Element[1]; header[0] new Element().createElement(NAMESPACE, Security); request.addHeader(header);7.3 使用Retrofit简化REST调用Retrofit是类型安全的HTTP客户端implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0定义API接口public interface ApiService { GET(users/{id}) CallUser getUser(Path(id) int userId); POST(users) CallVoid createUser(Body User user); }创建服务实例Retrofit retrofit new Retrofit.Builder() .baseUrl(https://api.example.com/) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build(); ApiService service retrofit.create(ApiService.class);8. 调试与测试技巧8.1 使用Stetho调试网络请求Facebook的Stetho工具可以方便地调试网络请求debugImplementation com.facebook.stetho:stetho:1.6.0 debugImplementation com.facebook.stetho:stetho-okhttp3:1.6.0初始化Stetho.initializeWithDefaults(this); OkHttpClient client new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor()) .build();8.2 Mock WebService响应使用MockWebServer进行单元测试testImplementation com.squareup.okhttp3:mockwebserver:4.9.3测试示例Test public void testWebService() throws Exception { MockWebServer server new MockWebServer(); server.start(); server.enqueue(new MockResponse() .setBody({\name\:\test\,\age\:30}) .setHeader(Content-Type, application/json)); ApiService service new Retrofit.Builder() .baseUrl(server.url(/)) .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService.class); CallUser call service.getUser(1); User user call.execute().body(); assertEquals(test, user.getName()); assertEquals(30, user.getAge()); server.shutdown(); }8.3 使用Charles Proxy抓包Charles是强大的HTTP抓包工具配置方法手机和电脑连接同一WiFi手机设置手动代理指向电脑IP端口8888在Charles中允许连接安装Charles证书到手机用于HTTPS解密注意生产环境务必关闭代理测试环境使用后也应清除证书

相关新闻

【Bug已解决】Forked thread token monitor over-accumulates usage after fork 解决方案

【Bug已解决】Forked thread token monitor over-accumulates usage after fork 解决方案

【Bug已解决】Forked thread token monitor over-accumulates usage after fork 解决方案 原始报错线索:Forked thread token monitor over-accumulates usage after fork(fork 出来的子进程里,那个统计 token 用量的监控线程,把用…

2026/8/5 9:02:19 阅读更多 →
2026世界人工智能大会亮点多:AI产业走向现实交付,多款创新产品亮相!

2026世界人工智能大会亮点多:AI产业走向现实交付,多款创新产品亮相!

AI热潮席卷2026世界人工智能大会今年的WAIC,已很难在一天内逛完。7月17日,2026世界人工智能大会在上海开幕。展览首次扩展至「三地四馆」,总面积超10万平方米,1100余家企业带来3000余项展品,超300款产品全球首发。智算…

2026/8/6 7:01:04 阅读更多 →
UE5顶点动画VAT全流程:从3dsMax烘焙到引擎性能优化

UE5顶点动画VAT全流程:从3dsMax烘焙到引擎性能优化

1. 项目概述:为什么我们需要VAT工作流?如果你在UE5里做过大规模场景,比如一片随风摇曳的麦田、成千上万的游动鱼群,或者战场上破碎的建筑残骸,那你一定对性能优化头疼过。传统的骨骼动画,每个实例都需要CPU…

2026/8/6 13:06:47 阅读更多 →

最新新闻

Unity开发中闭包的内存泄漏与循环变量捕获陷阱详解

Unity开发中闭包的内存泄漏与循环变量捕获陷阱详解

1. 项目概述:为什么Unity开发者必须搞懂闭包? 如果你用Unity和C#做过项目,尤其是UI交互或者异步逻辑,那你大概率已经和“闭包”打过交道了,只是你可能没意识到。它就像一个隐形的助手,帮你把变量“记住”并…

2026/8/6 14:19:59 阅读更多 →
凌晨两点,我的 DeepSeek Agent 差点删了所有子模块:monorepo 权限控制的五个生死时刻

凌晨两点,我的 DeepSeek Agent 差点删了所有子模块:monorepo 权限控制的五个生死时刻

当 /src 变成危险品:AI 编程助手的权限边界战争 上周四深夜的警报声格外刺耳——我们的 monorepo 里 23 个 TypeScript 子模块突然全部报出 cannot find module。监控大屏上 DeepSeek Agent 的操作日志还在疯狂刷新,.gitmodules 文件正在以每秒 3 次的频…

2026/8/6 14:19:59 阅读更多 →
数字时代社交异化:从孤能子现象到现实关系重建

数字时代社交异化:从孤能子现象到现实关系重建

1. 数字时代的"孤能子"现象解析 "孤能子"这个网络新词最近频繁出现在社交媒体讨论中,它形象地描绘了当代年轻人一种特殊的生活状态——在数字世界中高度活跃,却在现实社交中逐渐边缘化的群体。这个词由"孤独"、"社恐…

2026/8/6 14:19:59 阅读更多 →
前端国际化实战:从原生JS到框架集成的多语言方案全解析

前端国际化实战:从原生JS到框架集成的多语言方案全解析

1. 项目缘起:一个看似简单却暗藏玄机的需求 最近在重构一个个人项目的前端,产品经理提了一个“小需求”:给网站加个中英文切换。听起来很简单对吧?不就是放个按钮,点一下换套文字吗?我一开始也是这么想的&a…

2026/8/6 14:19:59 阅读更多 →
CUDA程序安全加固与CuFuzz模糊测试实践

CUDA程序安全加固与CuFuzz模糊测试实践

1. CUDA程序安全加固的必要性 在GPU加速计算领域,CUDA程序的安全性问题日益凸显。最近我在对几个开源CUDA项目进行安全审计时发现,超过60%的代码存在内存访问越界、未初始化变量使用等常见漏洞。这些隐患轻则导致计算结果错误,重则可能引发系…

2026/8/6 14:19:59 阅读更多 →
SAP-ABAP:调试效率提升技巧——调试脚本录制、断点模板复用与常用调试工具推荐

SAP-ABAP:调试效率提升技巧——调试脚本录制、断点模板复用与常用调试工具推荐

ABAP核心进阶篇(120篇):调试与性能优化(20篇) 第九篇:调试效率提升技巧——调试脚本录制、断点模板复用与常用调试工具推荐博客标题:《调试效率提升技巧:调试脚本录制、断点模板复用…

2026/8/6 14:18:59 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →