You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android连接PHP/MySQL时遇makeHttpRequest及Apache HTTP类缺失报错求助

解决Android连接PHP+MySQL时的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:17:52