AndroidHttpClient详解及调用示例
AndroidHttpClient详解及调用示例
什么是AndroidHttpClient
AndroidHttpClient是一个基于Apache HttpClient的AndroidHTTP客户端,它可以帮助我们更加轻松地使用HTTP/HTTPS来访问网络资源。在Android 6.0及以上版本中,AndroidHttpClient被标记为过时,我们应该更多地使用HttpURLConnection来进行网络请求,但在一些特殊情况,例如需要进行HTTP的身份认证,AndroidHttpClient仍然是一个不错的选择。
AndroidHttpClient的使用
创建AndroidHttpClient实例
我们可以通过如下方式来创建一个AndroidHttpClient实例:
AndroidHttpClient httpClient = AndroidHttpClient.newInstance("My-User-Agent");第一个参数是客户端的User-Agent,第二个参数是一个可选的HttpClientParams对象。
发送HTTP请求
以发送GET请求为例,我们可以这样调用:
HttpGet httpGet = new HttpGet(url);HttpResponse response = httpClient.execute(httpGet);其中url是你要请求的完整的网址。通过httpClient.execute()方法发送请求,并将HttpResponse对象返回。
处理HTTP响应
HttpResponse对象包含了HTTP响应的各种信息,包括响应状态码、响应头、响应体等等。我们可以通过以下方法获取它们:
int statusCode = response.getStatusLine().getStatusCode();Header[] headers = response.getAllHeaders();HttpEntity entity = response.getEntity();getStatusLine()方法会返回一个StatusLine对象,调用它的getStatusCode()方法可以获取HTTP响应的状态码。
调用getAllHeaders()方法可以获取响应头,返回一个Header数组。
调用getEntity()方法可以获取响应体,返回一个HttpEntity对象。
关闭AndroidHttpClient实例
在完成所有请求后,我们需要关闭AndroidHttpClient实例:
httpClient.close();AndroidHttpClient的完整示例
以下是一个简单的AndroidHttpClient的使用示例,它可以通过指定的url向某个服务器发出GET请求,获取该服务器返回的数据,然后将数据显示到TextView上。
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final String URL = "https://www.baidu.com/"; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.text_view); String result = executeGet(URL); mTextView.setText(result); } private String executeGet(String url) { AndroidHttpClient httpClient = AndroidHttpClient.newInstance(TAG); HttpGet httpGet = new HttpGet(url); try { HttpResponse httpResponse = httpClient.execute(httpGet); int statusCode = httpResponse.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { HttpEntity entity = httpResponse.getEntity(); String result = EntityUtils.toString(entity, "UTF-8"); return result; } else { Log.e(TAG, "请求出错,返回状态码:" + statusCode); } } catch (IOException e) { Log.e(TAG, "请求失败,异常原因:" + e.getMessage(), e); } finally { httpClient.close(); } return null; }}在代码中,我们首先通过AndroidHttpClient.newInstance()方法创建了一个AndroidHttpClient实例。然后,我们创建一个HttpGet对象,并调用httpClient.execute()方法来发送请求。最后,我们通过HttpResponse对象的getEntity()方法获取响应体,并将其转化成字符串。
AndroidHttpClient示例说明
示例一:调用百度翻译API
通过AndroidHttpClient来调用百度翻译API,我们可以将中文翻译成英文。以下是一个简单的示例:
private String executeGet(String url, String query) { AndroidHttpClient httpClient = AndroidHttpClient.newInstance(TAG); String appId = "你的APP ID"; String appKey = "你的密钥"; String salt = String.valueOf(System.currentTimeMillis()); String sign = DigestUtils.md5Hex(appId + query + salt + appKey); String urlWithParams = url + "?q=" + query + "&from=auto&to=en&appid=" + appId + "&salt=" + salt + "&sign=" + sign; HttpGet httpGet = new HttpGet(urlWithParams); try { HttpResponse httpResponse = httpClient.execute(httpGet); int statusCode = httpResponse.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { HttpEntity entity = httpResponse.getEntity(); String result = EntityUtils.toString(entity, "UTF-8"); return result; } else { Log.e(TAG, "请求出错,返回状态码:" + statusCode); } } catch (IOException e) { Log.e(TAG, "请求失败,异常原因:" + e.getMessage(), e); } finally { httpClient.close(); } return null;}在这个方法中,我们首先向url拼接了请求参数,包含了我们要翻译的文本、翻译源语言、翻译目标语言等信息。然后,我们像之前介绍的那样使用AndroidHttpClient.sendRequest()方法发送请求,并处理它的响应结果。
示例二:上传文件
在AndroidHttpClient中,上传文件是比较简单的,只需要构建一个MultipartEntity对象,将文件内容加入其中即可。以下是一个简单的示例:
private String executePost(String url, File file) { AndroidHttpClient httpClient = AndroidHttpClient.newInstance(TAG); HttpPost httpPost = new HttpPost(url); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addPart("file", new FileBody(file)); HttpEntity entity = builder.build(); httpPost.setEntity(entity); try { HttpResponse httpResponse = httpClient.execute(httpPost); int statusCode = httpResponse.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { HttpEntity responseEntity = httpResponse.getEntity(); String result = EntityUtils.toString(responseEntity, "UTF-8"); return result; } else { Log.e(TAG, "请求出错,返回状态码:" + statusCode); } } catch (IOException e) { Log.e(TAG, "请求失败,异常原因:" + e.getMessage(), e); } finally { httpClient.close(); } return null;}在这个方法中,我们对于要上传的文件创建了一个FileBody对象并将其加到了一个MultipartEntityBuilder对象中。然后,我们将MultipartEntityBuilder对象构造为一个HttpEntity,并将其赋值给HttpPost对象的entity成员变量,最后像之前一样使用AndroidHttpClient发出请求并处理响应结果。
注意:对于上传文件,需要在AndroidManifest.xml中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />同时其应用场景较少,推荐使用更安全的方式进行文件上传。