当前位置:   article > 正文

Android HTTP客户端:GET,POST,下载,上传,分段请求

android http客户端

通常,Android应用程序必须与远程服务器交换信息。 最简单的方法是使用HTTP协议作为基础来传输信息。 HTTP协议在许多情况下非常有用,例如从远程服务器下载图像或一些二进制数据上传到服务器。 Android应用执行GET或POST请求以发送数据。 在本文中,我们要分析如何使用HttpURLConnection与远程服务器进行通信。 我们将涵盖三个主要主题:

  • GET和POST请求
  • 从服务器下载数据
  • 使用MultipartRequest将数据上传到服务器

作为服务器,我们将使用在Tomcat 7.0内运行的三个简单Servlet。 我们不会介绍如何使用API​​ 3.0创建Servlet,但是源代码将很快可用。

GET和POST请求

GET和POST请求是HTTP协议的基础块。 要发出这种请求,我们首先需要打开与删除服务器的连接:

  1. HttpURLConnection con = (HttpURLConnection) ( new URL(url)).openConnection();
  2. con.setRequestMethod("POST");
  3. con.setDoInput(true);
  4. con.setDoOutput(true);
  5. con.connect();

在第一行中,我们获得HttpURLConnection,而在第二行中,我们设置方法,最后,我们连接到服务器。

打开连接后,我们可以使用OutputStream在其上进行写操作。

con.getOutputStream().write( ("name=" + name).getBytes());

众所周知,参数是使用键值对编写的。

最后一步是使用InputStream读取响应:

  1. InputStream is = con.getInputStream();
  2. byte[] b = new byte[1024];
  3. while ( is.read(b) != -1)
  4. buffer.append(new String(b));
  5. con.disconnect();

到目前为止,一切都非常简单,但是我们必须记住一件事:建立HTTP连接是一项耗时的操作,可能需要很长时间,因此我们无法在主线程中运行它,否则会遇到ANR问题。 为了解决这个问题,我们可以使用AsyncTask。

  1. private class SendHttpRequestTask extends AsyncTask<String, Void, String>{
  2. @Override
  3. protected String doInBackground(String... params) {
  4. String url = params[0];
  5. String name = params[1];
  6. String data = sendHttpRequest(url, name);
  7. return data;
  8. }
  9. @Override
  10. protected void onPostExecute(String result) {
  11. edtResp.setText(result);
  12. item.setActionView(null);
  13. }
  14. }

运行我们得到的应用程序:

android_httpclient_post_get_1 android_httpclient_post_get_2

如我们所见,我们在服务器上发布了一个名称,并以经典的“ Hello…。”作为响应。 在服务器端,我们可以检查服务器是否正确接收了我们的post参数:

从服务器下载数据

最常见的情况之一是Android应用程序必须从远程服务器下载一些数据。 我们可以假设我们要从服务器下载图像。 在这种情况下,我们必须始终使用AsyncTask来完成操作,代码如下所示:

  1. public byte[] downloadImage(String imgName) {
  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3. try {
  4. System.out.println("URL ["+url+"] - Name ["+imgName+"]");
  5. HttpURLConnection con = (HttpURLConnection) ( new URL(url)).openConnection();
  6. con.setRequestMethod("POST");
  7. con.setDoInput(true);
  8. con.setDoOutput(true);
  9. con.connect();
  10. con.getOutputStream().write( ("name=" + imgName).getBytes());
  11. InputStream is = con.getInputStream();
  12. byte[] b = new byte[1024];
  13. while ( is.read(b) != -1)
  14. baos.write(b);
  15. con.disconnect();
  16. }
  17. catch(Throwable t) {
  18. t.printStackTrace();
  19. }
  20. return baos.toByteArray();
  21. }

以这种方式调用此方法:

  1. private class SendHttpRequestTask extends AsyncTask<String, Void, byte[]> {
  2. @Override
  3. protected byte[] doInBackground(String... params) {
  4. String url = params[0];
  5. String name = params[1];
  6. HttpClient client = new HttpClient(url);
  7. byte[] data = client.downloadImage(name);
  8. return data;
  9. }
  10. @Override
  11. protected void onPostExecute(byte[] result) {
  12. Bitmap img = BitmapFactory.decodeByteArray(result, 0, result.length);
  13. imgView.setImageBitmap(img);
  14. item.setActionView(null);
  15. }
  16. }

运行我们拥有的应用程序:

使用MultipartRequest将数据上传到服务器

这是处理http连接中最复杂的部分。 本地的HttpURLConnection不能处理这种类型的请求。 Android应用可能必须将一些二进制数据上传到服务器。 例如,某个应用可能必须上传图像。 在这种情况下,请求变得更加复杂,因为“普通”请求是不够的。 我们必须创建一个MultipartRequest。

MultipartRequest是由不同部分(例如参数和二进制数据)发出的请求。 我们如何处理此请求?

好了,第一步是打开一个连接,通知服务器我们要发送一些二进制信息:

  1. public void connectForMultipart() throws Exception {
  2. con = (HttpURLConnection) ( new URL(url)).openConnection();
  3. con.setRequestMethod("POST");
  4. con.setDoInput(true);
  5. con.setDoOutput(true);
  6. con.setRequestProperty("Connection", "Keep-Alive");
  7. con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
  8. con.connect();
  9. os = con.getOutputStream();
  10. }

在第6行和第7行中,我们指定了请求内容类型和另一个称为boundary的字段。 此字段是用于分隔不同部分的char序列。

对于我们要添加的每个部分,我们需要指定它是文本部分(如post参数)还是文件(即二进制数据)。

  1. public void addFormPart(String paramName, String value) throws Exception {
  2. writeParamData(paramName, value);
  3. }
  4. private void writeParamData(String paramName, String value) throws Exception {
  5. os.write( (delimiter + boundary + "\r\n").getBytes());
  6. os.write( "Content-Type: text/plain\r\n".getBytes());
  7. os.write( ("Content-Disposition: form-data; name=\"" + paramName + "\"\r\n").getBytes());;
  8. os.write( ("\r\n" + value + "\r\n").getBytes());
  9. }

哪里

  1. private String delimiter = "--";
  2. private String boundary = "SwA"+Long.toString(System.currentTimeMillis())+"SwA";

要添加文件部分,我们可以使用:

  1. public void addFilePart(String paramName, String fileName, byte[] data) throws Exception {
  2. os.write( (delimiter + boundary + "\r\n").getBytes());
  3. os.write( ("Content-Disposition: form-data; name=\"" + paramName + "\"; filename=\"" + fileName + "\"\r\n" ).getBytes());
  4. os.write( ("Content-Type: application/octet-stream\r\n" ).getBytes());
  5. os.write( ("Content-Transfer-Encoding: binary\r\n" ).getBytes());
  6. os.write("\r\n".getBytes());
  7. os.write(data);
  8. os.write("\r\n".getBytes());
  9. }

因此,在我们的应用程序中,我们有:

  1. private class SendHttpRequestTask extends AsyncTask<String, Void, String> {
  2. @Override
  3. protected String doInBackground(String... params) {
  4. String url = params[0];
  5. String param1 = params[1];
  6. String param2 = params[2];
  7. Bitmap b = BitmapFactory.decodeResource(UploadActivity.this.getResources(), R.drawable.logo);
  8. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  9. b.compress(CompressFormat.PNG, 0, baos);
  10. try {
  11. HttpClient client = new HttpClient(url);
  12. client.connectForMultipart();
  13. client.addFormPart("param1", param1);
  14. client.addFormPart("param2", param2);
  15. client.addFilePart("file", "logo.png", baos.toByteArray());
  16. client.finishMultipart();
  17. String data = client.getResponse();
  18. }
  19. catch(Throwable t) {
  20. t.printStackTrace();
  21. }
  22. return null;
  23. }
  24. @Override
  25. protected void onPostExecute(String data) {
  26. item.setActionView(null);
  27. }
  28. }

运行它,我们有:

android_tomcat_post_upload_log android_httpclient_post_upload

源代码@ github


翻译自: https://www.javacodegeeks.com/2013/06/android-http-client-get-post-download-upload-multipart-request.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/413568
推荐阅读
相关标签
  

闽ICP备14008679号