我需要 Android 中 HttpClient 的替代选项来将数据发送到 PHP,因为它不再受支持

Posted

技术标签:

【中文标题】我需要 Android 中 HttpClient 的替代选项来将数据发送到 PHP,因为它不再受支持【英文标题】:I need an alternative option to HttpClient in Android to send data to PHP as it is no longer supported 【发布时间】:2015-05-17 11:58:36 【问题描述】:

目前我正在使用HttpClientHttpPostandroid app 向我的php server 发送数据,但是所有这些方法在 API 22 中已被弃用并在 API 23 中被删除,那么有哪些替代选项可以是吗?

我到处搜索,但没有找到任何东西。

【问题讨论】:

您应该澄清您使用的平台(java、php、ruby?)以及您现在使用的库+版本,以及您尝试更新到的库+版本(包括确切的版本和库名称)。 我正在使用 HttpPost 和 HttpClient 将数据从 Android 应用程序发送到 PHP,但这些方法在 API 22 的新更新中已被弃用,因此我需要一些选项 【参考方案1】:

我也遇到了这个问题来解决我自己的课程。 基于java.net,最高支持android的API 24 请检查一下: HttpRequest.java

使用这个类你可以很容易地:

    发送HttpGET请求 发送HttpPOST请求 发送HttpPUT请求 发送httpDELETE 发送没有额外数据参数的请求并检查响应HTTP status code 将自定义HTTP Headers 添加到请求(使用可变参数) 将数据参数作为String查询添加到请求 将数据参数添加为HashMap key=value 以String 接受响应 以JSONObject 接受响应 接受byte [] 字节数组(对文件有用)的响应

以及这些的任意组合 - 只需一行代码)

这里有几个例子:

//Consider next request: 
HttpRequest req=new HttpRequest("http://host:port/path");

示例 1

//prepare Http Post request and send to "http://host:port/path" with data params name=Bubu and age=29, return true - if worked
req.prepare(HttpRequest.Method.POST).withData("name=Bubu&age=29").send();

示例 2

// prepare http get request,  send to "http://host:port/path" and read server's response as String 
req.prepare().sendAndReadString();

示例 3

// prepare Http Post request and send to "http://host:port/path" with data params name=Bubu and age=29 and read server's response as JSONObject 
HashMap<String, String>params=new HashMap<>();
params.put("name", "Groot"); 
params.put("age", "29");
req.prepare(HttpRequest.Method.POST).withData(params).sendAndReadJSON();

示例 4

//send Http Post request to "http://url.com/b.c" in background  using AsyncTask
new AsyncTask<Void, Void, String>()
        protected String doInBackground(Void[] params) 
            String response="";
            try 
                response=new HttpRequest("http://url.com/b.c").prepare(HttpRequest.Method.POST).sendAndReadString();
             catch (Exception e) 
                response=e.getMessage();
            
            return response;
        
        protected void onPostExecute(String result) 
            //do something with response
        
    .execute(); 

示例 5

//Send Http PUT request to: "http://some.url" with request header:
String json="\"name\":\"Deadpool\",\"age\":40";//JSON that we need to send
String url="http://some.url";//URL address where we need to send it 
HttpRequest req=new HttpRequest(url);//HttpRequest to url: "http://some.url"
req.withHeaders("Content-Type: application/json");//add request header: "Content-Type: application/json"
req.prepare(HttpRequest.Method.PUT);//Set HttpRequest method as PUT
req.withData(json);//Add json data to request body
JSONObject res=req.sendAndReadJSON();//Accept response as JSONObject

示例 6

//Equivalent to previous example, but in a shorter way (using methods chaining):
String json="\"name\":\"Deadpool\",\"age\":40";//JSON that we need to send
String url="http://some.url";//URL address where we need to send it 
//Shortcut for example 5 complex request sending & reading response in one (chained) line
JSONObject res=new HttpRequest(url).withHeaders("Content-Type: application/json").prepare(HttpRequest.Method.PUT).withData(json).sendAndReadJSON();

示例 7

//Downloading file
byte [] file = new HttpRequest("http://some.file.url").prepare().sendAndReadBytes();
FileOutputStream fos = new FileOutputStream("smile.png");
fos.write(file);
fos.close();

【讨论】:

看起来是这个问题的正确答案 不推荐使用的 httpClient、NameValuePair 的最佳示例。推荐给其他人。 上传文件到服务器怎么样? @DavidUntama 只需将其作为 JSON 发送,然后在您的服务器上使用 GSON.fromJson 来解析它。【参考方案2】:

HttpClient 已被弃用,现已删除:

org.apache.http.client.HttpClient:

此接口在 API 级别 22 中已弃用。 请改用 openConnection()。请访问此网页了解更多详情。

表示你应该切换到java.net.URL.openConnection()

另请参阅新的 HttpURLConnection 文档。

你可以这样做:

URL url = new URL("http://some-server");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");

// read the response
System.out.println("Response Code: " + conn.getResponseCode());
InputStream in = new BufferedInputStream(conn.getInputStream());
String response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");
System.out.println(response);

IOUtils 文档:Apache Commons IOIOUtils Maven 依赖:http://search.maven.org/#artifactdetails|org.apache.commons|commons-io|1.3.2|jar

【讨论】:

您的答案中的IOUtils 是什么? 通过添加指向 Commons IO (IOUtils) 文档和 maven 搜索站点的链接来改进答案。【参考方案3】:

以下代码在 AsyncTask 中:

在我的后台进程中:

String POST_PARAMS = "param1=" + params[0] + "&param2=" + params[1];
URL obj = null;
HttpURLConnection con = null;
try 
    obj = new URL(Config.YOUR_SERVER_URL);
    con = (HttpURLConnection) obj.openConnection();
    con.setRequestMethod("POST");

    // For POST only - BEGIN
    con.setDoOutput(true);
    OutputStream os = con.getOutputStream();
    os.write(POST_PARAMS.getBytes()); 
    os.flush();
    os.close();
    // For POST only - END

    int responseCode = con.getResponseCode();
    Log.i(TAG, "POST Response Code :: " + responseCode);

    if (responseCode == HttpURLConnection.HTTP_OK)  //success
         BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
         String inputLine;
         StringBuffer response = new StringBuffer();

         while ((inputLine = in.readLine()) != null) 
              response.append(inputLine);
         
         in.close();

         // print result
            Log.i(TAG, response.toString());
             else 
            Log.i(TAG, "POST request did not work.");
            
         catch (IOException e) 
            e.printStackTrace();
        

参考: http://www.journaldev.com/7148/java-httpurlconnection-example-to-send-http-getpost-requests

【讨论】:

【参考方案4】:

这是我在此版本的android 22中不推荐使用httpclient的问题的解决方案`

 public static final String USER_AGENT = "Mozilla/5.0";



public static String sendPost(String _url,Map<String,String> parameter)  
    StringBuilder params=new StringBuilder("");
    String result="";
    try 
    for(String s:parameter.keySet())
        params.append("&"+s+"=");

            params.append(URLEncoder.encode(parameter.get(s),"UTF-8"));
    


    String url =_url;
    URL obj = new URL(_url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    con.setRequestMethod("POST");
    con.setRequestProperty("User-Agent", USER_AGENT);
    con.setRequestProperty("Accept-Language", "UTF-8");

    con.setDoOutput(true);
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream());
    outputStreamWriter.write(params.toString());
    outputStreamWriter.flush();

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Post parameters : " + params);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) 
        response.append(inputLine + "\n");
    
    in.close();

        result = response.toString();
     catch (UnsupportedEncodingException e) 
        e.printStackTrace();
     catch (MalformedURLException e) 
        e.printStackTrace();
     catch (ProtocolException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    catch (Exception e) 
        e.printStackTrace();
    finally 
    return  result;
    


【讨论】:

【参考方案5】:

您可以继续使用 HttpClient。 Google 只弃用了他们自己版本的 Apache 组件。您可以安装全新、强大且非弃用的 Apache HttpClient 版本,就像我在这篇文章中描述的那样:https://***.com/a/37623038/1727132

【讨论】:

【参考方案6】:

如果针对 API 22 及更早版本,则应在 build.gradle 中添加以下行

dependencies 
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'

如果针对 API 23 及更高版本,则应在 build.gradle 中添加以下行

dependencies 
    compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1'

如果还想使用 httpclient 库,在 Android Marshmallow (sdk 23) 中,可以添加:

useLibrary 'org.apache.http.legacy'

在 android 部分中的 build.gradle 作为解决方法。这对于一些 Google 自己的 gms 库来说似乎是必要的!

【讨论】:

【参考方案7】:

哪个客户端最好?

Apache HTTP 客户端在 Eclair 和 Froyo 上的错误更少。这是最好的 这些版本的选择。

对于 Gingerbread 和更好的,HttpURLConnection 是最佳选择。它的 简单的 API 和小尺寸使其非常适合 Android...

更多信息请参考here(Android 开发者博客)

【讨论】:

【参考方案8】:

您可以使用我易于使用的自定义类。 只需创建抽象类(匿名)的对象并定义 onsuccess() 和 onfail() 方法。 https://github.com/creativo123/POSTConnection

【讨论】:

我认为最好使用HttpURLConnection,如***.com/a/2938787/3281252中所述。【参考方案9】:

我在使用 HttpClentHttpPost 方法时遇到了类似的问题,因为我不想更改我的代码,所以我在 build.gradle(module) 文件中找到了替代选项从 buildToolsVersion "23.0.1 rc3" 中删除 'rc3' 它对我有用。希望有帮助。

【讨论】:

以上是关于我需要 Android 中 HttpClient 的替代选项来将数据发送到 PHP,因为它不再受支持的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpClient 在 Android 中重用 SSL 会话

Android HttpClient 和 Cookie

ANDROID : 在 Webview 和 httpclient 之间共享会话

Android HttpClient 和 HTTPS

Android studio 中想用 HttpClient 下载网络图片,却没有 HttpClient 以及相关的类

Apache HttpClient 4.0 无法在 Android 上的套接字超时