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。

相关文章
|
1月前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
39 2
|
1月前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
23 1
|
1月前
|
存储 JSON JavaScript
【chat-gpt问答记录】python将数据存为json格式和yaml格式
【chat-gpt问答记录】python将数据存为json格式和yaml格式
38 1
|
17天前
|
JSON 文字识别 数据格式
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
|
19天前
|
存储 JSON JavaScript
使用JSONObject解析与生成JSON数据
使用JSONObject解析与生成JSON数据
|
20天前
|
JSON 前端开发 JavaScript
Go怎么解析不定JSON数据?
在Go中处理不确定结构的JSON数据,可以使用`map[string]interface{}`来解析,它能适应各种JSON键值对,但需要类型检查。另一种方法是使用`json.RawMessage`保存原始JSON,之后按需解析。此外,`json.Number`用于处理任意精度的数字。当JSON字段类型未知时,可以先解码到`interface{}`并做类型断言。第三方库如gjson和jsonparser提供更灵活的解析选项。
|
2天前
|
JSON 分布式计算 大数据
MaxCompute产品使用合集之如何解析嵌套的JSON数据
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
9天前
|
JSON JavaScript 前端开发
技术心得:利用JsonSchema校验json数据内容的合规性
技术心得:利用JsonSchema校验json数据内容的合规性
10 0
|
15天前
|
JSON 数据格式
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
|
16天前
|
JSON 数据格式
Unsupported Media Type,传入的字符串数据:这里应该是Json
Unsupported Media Type,传入的字符串数据:这里应该是Json