知识问答

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" />

同时其应用场景较少,推荐使用更安全的方式进行文件上传。