Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

简介: Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

Android中使用HttpURLConnection实现GET POST JSON数据与下载图片


Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用


所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是


很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数


据交互,本人刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个


坑,总结下最常用的就通过HttpURLConnection来POST提交JSON数据与GET请求


JSON数据。此外就是下载图片,下载图片分为显示进度与不显示进度两种。其中提交


数据的时候涉及中文一定要先把中文转码成utf-8之后在POST提交,否则就会一直遇到


HTTP 400的错误。

一:GET请求JSON数据的例子

public UserDto execute(String... params) {
  InputStream inputStream = null;
  HttpURLConnection urlConnection = null;
 
  try {
    // read responseURLEncoder.encode(para, "GBK");
    String urlWithParams = DOMAIN_ADDRESS + MEMBER_REQUEST_TOKEN_URL + "?userName=" + java.net.URLEncoder.encode(params[0],"utf-8") + "&password=" + params[1];
    URL url = new URL(urlWithParams);
    urlConnection = (HttpURLConnection) url.openConnection();
 
    /* optional request header */
    urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
 
    /* optional request header */
    urlConnection.setRequestProperty("Accept", "application/json");
 
    /* for Get request */
    urlConnection.setRequestMethod("GET");
    int statusCode = urlConnection.getResponseCode();
 
    /* 200 represents HTTP OK */
    if (statusCode == 200) {
      inputStream = new BufferedInputStream(urlConnection.getInputStream());
      String response = HttpUtil.convertInputStreamToString(inputStream);
      Gson gson = new Gson();
      UserDto dto = gson.fromJson(response, UserDto.class);
      if (dto != null && dto.getToken() != null) {
        Log.i("token", "find the token = " + dto.getToken());
      }
      return dto;
    }
 
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    if (inputStream != null) {
      try {
        inputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    if (urlConnection != null) {
      urlConnection.disconnect();
    }
  }
  return null;
}

二:POST提交JSON数据

public Map<String, String> execute(NotificationDto dto) {
  InputStream inputStream = null;
  HttpURLConnection urlConnection = null;
  try {
    URL url = new URL(getUrl);
    urlConnection = (HttpURLConnection) url.openConnection();
 
    /* optional request header */
    urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
 
    /* optional request header */
    urlConnection.setRequestProperty("Accept", "application/json");
    dto.setCreator(java.net.URLEncoder.encode(dto.getCreator(), "utf-8"));
    
    // read response
    /* for Get request */
    urlConnection.setRequestMethod("POST");
    urlConnection.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
    Gson gson = new Gson();
    String jsonString = gson.toJson(dto);
    wr.writeBytes(jsonString);
    wr.flush();
    wr.close();
    // try to get response
    int statusCode = urlConnection.getResponseCode();
    if (statusCode == 200) {
      inputStream = new BufferedInputStream(urlConnection.getInputStream());
      String response = HttpUtil.convertInputStreamToString(inputStream);
      Map<String, String> resultMap = gson.fromJson(response, Map.class);
      if (resultMap != null && resultMap.size() > 0) {
        Log.i("applyDesigner", "please check the map with key");
      }
      return resultMap;
    }
  }
  catch(Exception e)
  {
    e.printStackTrace();
  }
  finally
  {
    if (inputStream != null) {
      try {
        inputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    if (urlConnection != null) {
      urlConnection.disconnect();
    }
  }
  return null;
}

三:下载图片显示下载进度

package com.example.demo;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
 
public class ImageLoadTask extends AsyncTask<String, Void, Bitmap> {
  private Handler handler;
 
  public ImageLoadTask(Handler handler) {
    this.handler = handler;
  }
 
  protected void onPostExecute(Bitmap result) {
    Message msg = new Message();
    msg.obj = result;
    handler.sendMessage(msg);
  }
 
  protected Bitmap doInBackground(String... getUrls) {
    InputStream inputStream = null;
    HttpURLConnection urlConnection = null;
 
    try {
      // open connection
      URL url = new URL(getUrls[0]);
      urlConnection = (HttpURLConnection) url.openConnection();
      /* for Get request */
      urlConnection.setRequestMethod("GET");
      int fileLength = urlConnection.getContentLength();
      int statusCode = urlConnection.getResponseCode();
      if (statusCode == 200) {
        inputStream = urlConnection.getInputStream();
        byte data[] = new byte[4096];
        long total = 0;
        int count;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        while ((count = inputStream.read(data)) != -1) {
          total += count;
          // publishing the progress....
          if (fileLength > 0 && handler != null) {
            handler.sendEmptyMessage(((int) (total * 100 / fileLength)) - 1);
          }
          output.write(data, 0, count);
        }
        ByteArrayInputStream bufferInput = new ByteArrayInputStream(output.toByteArray());
        Bitmap bitmap = BitmapFactory.decodeStream(bufferInput);
        inputStream.close();
        bufferInput.close();
        output.close();
        Log.i("image", "already get the image by uuid : " + getUrls[0]);
        handler.sendEmptyMessage(100);
        return bitmap;
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (inputStream != null) {
        try {
          inputStream.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if (urlConnection != null) {
        urlConnection.disconnect();
      }
    }
    return null;
  }
 
}

总结:使用HttpURLConnection提交JSON数据的时候编码方式为UTF-8

所有中文字符请一定要预先转码为UTF-8,然后在后台服务器对应的API

中解码为UTF-8,不然就会报错HTTP 400。

相关文章
|
9月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
582 11
|
11月前
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
500 3
Android利用selector(选择器)实现图片动态点击效果
|
11月前
|
Java Android开发
Android图片的手动放大缩小
本文介绍了通过缩放因子实现图片放大缩小的功能,效果如动图所示。关键步骤包括:1) 在布局文件中设置 `android:scaleType=&quot;matrix&quot;`;2) 实例化控件并用 `ScaleGestureDetector` 处理缩放手势;3) 使用 `Matrix` 对图片进行缩放处理。为避免内存崩溃,可在全局配置添加 `android:largeHeap=&quot;true&quot;`。代码中定义了 `beforeScale` 和 `nowScale` 变量控制缩放范围,确保流畅体验。
354 8
|
11月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
2557 2
|
11月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
422 1
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
872 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
Android--httpclient模拟post请求和get请求
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/50964727 HttpClient的使用模式: 1.
1069 0
|
6月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
998 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
796 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
985 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡