我需要 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 【问题描述】:目前我正在使用HttpClient
、HttpPost
从android app
向我的php server
发送数据,但是所有这些方法在 API 22 中已被弃用并在 API 23 中被删除,那么有哪些替代选项可以是吗?
我到处搜索,但没有找到任何东西。
【问题讨论】:
您应该澄清您使用的平台(java、php、ruby?)以及您现在使用的库+版本,以及您尝试更新到的库+版本(包括确切的版本和库名称)。 我正在使用 HttpPost 和 HttpClient 将数据从 Android 应用程序发送到 PHP,但这些方法在 API 22 的新更新中已被弃用,因此我需要一些选项 【参考方案1】:我也遇到了这个问题来解决我自己的课程。 基于java.net,最高支持android的API 24 请检查一下: HttpRequest.java
使用这个类你可以很容易地:
-
发送Http
GET
请求
发送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] + "¶m2=" + 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】:我在使用 HttpClent 和 HttpPost 方法时遇到了类似的问题,因为我不想更改我的代码,所以我在 build.gradle(module) 文件中找到了替代选项从 buildToolsVersion "23.0.1 rc3" 中删除 'rc3' 它对我有用。希望有帮助。
【讨论】:
以上是关于我需要 Android 中 HttpClient 的替代选项来将数据发送到 PHP,因为它不再受支持的主要内容,如果未能解决你的问题,请参考以下文章
使用 HttpClient 在 Android 中重用 SSL 会话
ANDROID : 在 Webview 和 httpclient 之间共享会话