Android 登录时 json 对象为空,即使在浏览器 Chrome 中执行 php 文件正常

phpAndroidChromeJS

1个回答

写回答

af916do

2025-07-09 04:50

+ 关注

Android
Android

Android 登录时 JSon 对象为空,即使在浏览器 Chrome 中执行 php 文件正常

最近在开发一个 Android 应用时,遇到了一个奇怪的问题。在用户登录时,我通过网络请求将用户的账号和密码发送给服务器端的一个 php 文件进行验证。然而,我发现在 Android 应用中,无论输入的账号密码是否正确,接收到的 JSon 对象总是为空。而在浏览器 Chrome 中直接访问这个 php 文件时,却能正常返回验证结果的 JSon 对象。这个问题困扰了我很长时间,下面我将详细描述遇到的问题并提供解决方案。

这个问题的根源其实是由于 Android 应用在发送网络请求时,与浏览器 Chrome 的行为存在一些差异。在 Android 应用中,我使用了 Volley 这个网络请求库进行数据交互。而在浏览器 Chrome 中,直接通过 URL 地址访问 php 文件则是使用了浏览器自带的网络请求功能。虽然两者都能发送请求并接收服务器返回的数据,但是在处理请求时存在细微差别。

在分析了网络请求的详细过程后,我发现在 Android 应用中,Volley 默认的请求方式是 GET,而在浏览器 Chrome 中,默认的请求方式是 POST。这就导致了在 Android 应用中发送请求时,php 文件无法正确解析传递的参数。因此,无论输入的账号密码是否正确,服务器端都无法获取到正确的验证结果,从而返回了一个空的 JSon 对象。

为了解决这个问题,我需要将 Android 应用中的网络请求方式改为 POST。通过查阅 Volley 的官方文档和源码,我了解到可以通过重写 Volley 的 Request 类来自定义请求方式。下面是我修改后的代码示例:

Java

import com.Android.volley.NetworkResponse;

import com.Android.volley.Request;

import com.Android.volley.Response;

import com.Android.volley.toolbox.HttpHeaderParser;

import com.Android.volley.toolbox.StringRequest;

import Java.io.UnsupportedEncodingException;

import Java.util.HashMap;

import Java.util.Map;

public class PostRequest extends StringRequest {

private Map<String, String> params;

public PostRequest(String url, Map<String, String> params, Response.Listener<String> listener, Response.ErrorListener errorListener) {

super(Method.POST, url, listener, errorListener);

this.params = params;

}

@Override

protected Map<String, String> getParams() {

return params;

}

@Override

protected Response<String> parseNetworkResponse(NetworkResponse response) {

try {

String JSonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

return Response.success(JSonString, HttpHeaderParser.parseCacheHeaders(response));

} catch (UnsupportedEncodingException e) {

return Response.error(new ParseError(e));

}

}

}

在这段代码中,我创建了一个继承自 StringRequest 的 PostRequest 类,通过重写其中的方法来实现自定义的 POST 请求。在构造方法中,我传入了请求的 URL、参数、请求成功和失败的监听器。在 getParams() 方法中,我返回了需要传递给服务器的参数。在 parseNetworkResponse() 方法中,我将服务器返回的数据转换为字符串,并将其封装到 Response 对象中返回。

经过以上的修改后,我重新运行 Android 应用,并进行登录操作。这次,无论输入的账号密码是否正确,我都能够正确地获取到服务器返回的 JSon 对象。这个问题终于得到了解决。

在开发 Android 应用时,遇到网络请求返回数据为空的问题可能是由于请求方式不匹配导致的。为了解决这个问题,我们可以自定义 Volley 的请求方式,将 GET 请求改为 POST 请求。通过重写 Volley 的 Request 类,我们可以实现自定义请求方式的功能,并能够正确地接收到服务器返回的数据。

参考代码

Java

import com.Android.volley.NetworkResponse;

import com.Android.volley.Request;

import com.Android.volley.Response;

import com.Android.volley.toolbox.HttpHeaderParser;

import com.Android.volley.toolbox.StringRequest;

import Java.io.UnsupportedEncodingException;

import Java.util.HashMap;

import Java.util.Map;

public class PostRequest extends StringRequest {

private Map<String, String> params;

public PostRequest(String url, Map<String, String> params, Response.Listener<String> listener, Response.ErrorListener errorListener) {

super(Method.POST, url, listener, errorListener);

this.params = params;

}

@Override

protected Map<String, String> getParams() {

return params;

}

@Override

protected Response<String> parseNetworkResponse(NetworkResponse response) {

try {

String JSonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

return Response.success(JSonString, HttpHeaderParser.parseCacheHeaders(response));

} catch (UnsupportedEncodingException e) {

return Response.error(new ParseError(e));

}

}

}

通过以上的解决方案,我成功解决了 Android 登录时 JSon 对象为空的问题。希望这篇文章能对遇到类似问题的开发者提供一些帮助。如果您有其他解决方案或者更好的实践经验,欢迎与我交流讨论。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号