Android开发错误锦囊-Internal Server Error

2024-05-22 06:58

本文主要是介绍Android开发错误锦囊-Internal Server Error,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Android开发中我们经常会遇到上传图片,然而在上传图片的过程中大家很可能会遇到Internal Server Error这个错误,下面我们来看一下这个错误是如何产生的:

用xutils3上传文件

1.加入xutils3框架代码

    compile 'org.xutils:xutils:3.3.36'

2.用法

/**定义请求参数**/
RequestParams requestParams=new RequestParams("http://10.58.178.120:8080/intco/mobi/member/uploadImage");requestParams.addBodyParameter("mId", "1");requestParams.addBodyParameter("imgFile", new File(path));
/**打印请求参数**/
Log.i("dylan","请求链接:"+params.toString());/**发起post请求**/
x.http().post(requestParams, new Callback.CommonCallback<String>() {@Overridepublic void onSuccess(String result) {Log.i(TAG, "onSuccess--" + info + "---->" + result);}}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {ex.printStackTrace();}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}});}

3.请求结果

10-19 19:05:07.806 19247-19247/com.bm.ykzx I/NetworkRequest: onError--更换头像---->Internal Server Error

4.结果分析

我们发现请求并没有成功,而是在xutils的请求回调中只走了onError这个方法的回调,并打印了Internal Server Error,让我们很纳闷,到底是怎么了?问后台服务器,他们说也不知道怎么了。让我们折腾半天,因为iOS是可以上传成功的i,所以,就只能说是我们自己的错误。

解决思路

1.发现问题

我们发现我们和xutils3开源者给的例子就多了一句话,那就是:

Log.i("dylan","请求链接:"+params.toString());

就这是调用了一个对象的toString方法会有什么问题呢?
于是,我们就看一下改对象有没有覆写toString方法呢?

 /*** 在网络请求onStart前, 尽量不要在UI线程调用这个方法, 可能产生性能影响.** @return*/@Overridepublic String toString() {try {this.init();} catch (Throwable ex) {LogUtil.e(ex.getMessage(), ex);}String url = this.getUri();return TextUtils.isEmpty(url) ?super.toString() :url + (url.contains("?") ? "&" : "?") + super.toString();}

再来看看这个方法面还调用了 super.toString();再接着看

@Overridepublic String toString() {checkBodyParams();final StringBuilder sb = new StringBuilder();if (!queryStringParams.isEmpty()) {for (KeyValue kv : queryStringParams) {sb.append(kv.key).append("=").append(kv.value).append("&");}sb.deleteCharAt(sb.length() - 1);}if (HttpMethod.permitsRequestBody(this.method)) {sb.append("<");if (!TextUtils.isEmpty(bodyContent)) {sb.append(bodyContent);} else {if (!bodyParams.isEmpty()) {for (KeyValue kv : bodyParams) {sb.append(kv.key).append("=").append(kv.value).append("&");}sb.deleteCharAt(sb.length() - 1);}}sb.append(">");}return sb.toString();}

我们发现在super.toString()里面调用了checkBodyParams();下面我们来看看这个方法:

private void checkBodyParams() {if (bodyParams.isEmpty()) return;if (!HttpMethod.permitsRequestBody(method)|| !TextUtils.isEmpty(bodyContent)|| requestBody != null) {queryStringParams.addAll(bodyParams);bodyParams.clear();}if (!bodyParams.isEmpty() && (multipart || fileParams.size() > 0)) {fileParams.addAll(bodyParams);bodyParams.clear();}if (asJsonContent && !bodyParams.isEmpty()) {try {JSONObject jsonObject = null;if (!TextUtils.isEmpty(bodyContent)) {jsonObject = new JSONObject(bodyContent);} else {jsonObject = new JSONObject();}params2Json(jsonObject, bodyParams);bodyContent = jsonObject.toString();bodyParams.clear();} catch (JSONException ex) {throw new RuntimeException(ex);}}}

在上面的代码中我们发现了这句

if (!bodyParams.isEmpty() && (multipart || fileParams.size() > 0)) {fileParams.addAll(bodyParams);bodyParams.clear();}

2.找到问题

就是因为这句bodyParams.clear();虽然把参数给我们返回了但是把提交给服务器的参数都清了

3.总结

params.toString()是个坑,以后不能用这个打印这个参数值,去掉这个就好了

这篇关于Android开发错误锦囊-Internal Server Error的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996000

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10