Android连接PHP/MySQL时遇makeHttpRequest及Apache HTTP类缺失报错求助
嘿,作为Android开发新手碰到这些报错真的挺闹心的——找不到makeHttpRequest方法、org.apache.http包不存在、NameValuePair类找不到,这些问题本质都是Android版本迭代中移除了旧的Apache HTTP客户端导致的,我来一步步帮你搞定:
一、解决org.apache.http包和NameValuePair缺失问题
从Android 6.0(API 23)开始,官方默认移除了Apache HTTP客户端库,所以你需要手动添加兼容配置:
方案1:添加Apache HTTP客户端依赖(推荐)
在你的Module级别的build.gradle文件的dependencies块中加入以下代码:implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1'同步项目后,就能正常导入
NameValuePair相关类了:import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair;方案2:启用Legacy库(旧项目适配)
如果是比较旧的项目,也可以在AndroidManifest.xml的<application>标签内添加:<uses-library android:name="org.apache.http.legacy" android:required="false"/>
二、修复makeHttpRequest方法找不到的问题
这个方法应该是你的JSONParser类中需要实现的核心方法,大概率是你没有正确编写这个方法或者存在拼写错误。给你一个完整可运行的JSONParser实现示例,包含makeHttpRequest方法:
import android.util.Log; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.List; public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; public JSONParser() { // 构造函数 } // 处理HTTP请求并返回JSON对象 public JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params) { try { // 根据请求方法选择GET或POST if ("POST".equals(method)) { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } else if ("GET".equals(method)) { DefaultHttpClient httpClient = new DefaultHttpClient(); String paramString = URLEncodedUtils.format(params, "utf-8"); url += "?" + paramString; HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 将输入流转换为JSON字符串 try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } is.close(); json = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "转换结果时出错: " + e.toString()); } // 解析JSON字符串为JSONObject try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "解析数据时出错: " + e.toString()); } return jObj; } }
如果你的JSONParser已经有这个方法,请检查方法名拼写(大小写要完全一致)以及导入的类是否正确。
三、长远建议:切换到现代HTTP库
Apache HTTP客户端已经被官方弃用,后续版本可能会彻底移除,所以更推荐你使用HttpURLConnection或者第三方库如OkHttp来实现网络请求,兼容性和稳定性更好。比如用OkHttp发送POST请求的简单示例:
首先添加OkHttp依赖到build.gradle:
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
然后编写请求代码:
OkHttpClient client = new OkHttpClient(); // 构建表单参数 RequestBody formBody = new FormBody.Builder() .add("key1", "value1") .add("key2", "value2") .build(); Request request = new Request.Builder() .url("http://你的服务器接口地址") .post(formBody) .build(); // 异步发送请求 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); // 请求失败处理 } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String responseData = response.body().string(); // 解析返回的JSON数据 // 注意:更新UI需要切换到主线程 runOnUiThread(() -> { // 在这里处理UI更新 }); } } });
内容的提问来源于stack exchange,提问作者eliud liud

