Android uses HttpURLConnection to realize GET POST JSON data and download images

  • 2020-12-20 03:46:19
  • OfStack

Android6. 0 in the Apache HTTP Client all packages and classes are marked as deprecated not recommend the use of all the data associated with HTTP request and submit operations through HttpURLConnection class implements, the reality is that many Android developer 1 straight Apache HTTP Client for andoird HTTP interface to the client and the background data interaction, the site has just made a 1 android APP HttpURLConnection, carelessly trampled several pit, To summarize, the most common ones are POST submitting JSON data and GET requesting JSON data via HttpURLConnection. In addition is to download the picture, download the picture is divided into show progress and do not show progress of two kinds. When submitting data involving Chinese 1, you must first transcode Chinese to ES22en-8 and then submit it in POST; otherwise, you will directly encounter the error of HTTP 400.

Example of GET requesting JSON data


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; 
} 

2. POST submits JSON data


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; 
} 

3. Download pictures to show the download progress


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; 
 } 
 
} 

Summary: When using HttpURLConnection to submit JSON data, the encoding method is UTF-8. All Chinese characters should be transcoded as UTF-8 in advance, and then decoded as UTF-8 in the corresponding API in the background server. Otherwise, an error will be reported to HTTP 400.

That is the end of this article, I hope to help you learn Android software programming.


Related articles: