写在前面

该博客紧接上篇博客:https://www.cnblogs.com/wushenjiang/p/12937531.html,继续学习post请求,带参数的post和get请求以及文件上传与下载

post请求

其实post请求的方式与get请求差不太多,我们还是先上代码:

    public void postRequest(View v) {
new Thread(new Runnable() {
@Override
public void run() {
OutputStream outputStream = null;
InputStream inputStream = null;
try {
URL url = new URL(BASE_URL + "/post/comment");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setConnectTimeout(10000);
httpURLConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
httpURLConnection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
httpURLConnection.setRequestProperty("Accept", "application/json,text/plain,*/*"); CommentItem commentItem = new CommentItem("234134123", "我是评论内容...哈哈");
Gson gson = new Gson();
String jsonStr = gson.toJson(commentItem);
byte[] bytes = jsonStr.getBytes("UTF-8");
Log.d(TAG, "bytes==>" + bytes.length);
httpURLConnection.setRequestProperty("Content-Length", String.valueOf(bytes.length));
//连接
httpURLConnection.connect();
//把数据给到服务器
outputStream = httpURLConnection.getOutputStream();
outputStream.write(bytes);
outputStream.flush();
//拿到结果
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
Log.d(TAG, "result ==>" + bufferedReader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}

可以看到,与get请求不同的一点就是我们需要添加一个内容,然后把数据写入到服务端,最后关闭所有的流。整体的流程和get基本一致。

带参数的post和get请求

这里其实很类似,我们直接写一个方法统一起来:

 private void startRequest(final Map<String, String> params, final String method, final String api) {
new Thread(new Runnable() {
BufferedReader bufferedReader = null; @Override
public void run() {
StringBuilder sb = new StringBuilder("?");
try {
//组装参数
if (params != null && params.size() > 0) {
Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
sb.append(next.getKey());
sb.append("=");
sb.append(next.getValue());
if (iterator.hasNext()) {
sb.append("&");
}
}
Log.d(TAG, "sb result -->" + sb.toString());
}
URL url;
String paramsStr = sb.toString();
if (paramsStr != null && paramsStr.length() > 0) {
url = new URL(BASE_URL + api + paramsStr);
} else {
url = new URL(BASE_URL + api);
}
Log.d(TAG, "url ==>" + url.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod(method);
httpURLConnection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
httpURLConnection.setRequestProperty("Accept", "*/*");
httpURLConnection.connect();
int responseCode;
responseCode = httpURLConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = httpURLConnection.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String json = bufferedReader.readLine();
Log.d(TAG, "result ==>" + json);
} } catch (Exception e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}

可以看到,我们主要就是需要将url进行一个字符串拼接,我们使用StringBuilder来进行字符串拼接,要更为安全。具体的操作流程请见代码,不用多说了。

文件上传

我们要做文件上传,其实很简单。先来上代码:

  public void postFiles(View v) {
new Thread(new Runnable() {
OutputStream outputStream = null;
InputStream inputStream = null; @Override
public void run() {
try {
File fileOne = new File("/storage/emulated/0/Download/shop-ad.png");
File fileTwo = new File("/storage/emulated/0/Download/rBsADV64HDWAI6i_AAhJfxL8eXE287.png");
File fileThree = new File("/storage/emulated/0/Download/rBsADV64ILeAfwQMAAdBpy-0H04021.png");
String fileKey = "files";
String fileType = "image/png";
String BOUNDARY = "--------------------------246140106706876087289187";
// String BOUNDARY = "----------------------------246140106706876087289187";
URL url = new URL(BASE_URL + "/files/upload");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setConnectTimeout(10000);
httpURLConnection.setRequestProperty("User-Agent", "Android/" + Build.VERSION.SDK_INT);
httpURLConnection.setRequestProperty("Accept", "*/*");
httpURLConnection.setRequestProperty("Cache-Control", "no-cache");
httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
httpURLConnection.setRequestProperty("Connection", "keep-alive");
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
//连接
httpURLConnection.connect();
outputStream = httpURLConnection.getOutputStream();
uploadFile(fileOne, fileKey, fileOne.getName(), fileType, BOUNDARY, outputStream, false);
uploadFile(fileTwo, fileKey, fileTwo.getName(), fileType, BOUNDARY, outputStream, false);
uploadFile(fileThree, fileKey, fileThree.getName(), fileType, BOUNDARY, outputStream, true);
outputStream.flush();
//获取返回结果
int responseCode = httpURLConnection.getResponseCode();
Log.d(TAG, "responseCode ==>" + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) {
inputStream = httpURLConnection.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
String result = bf.readLine();
Log.d(TAG, "result ==>" + result);
} } catch (Exception e) {
e.printStackTrace();
} finally {
// if (bfi != null) {
// try {
// bfi.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} private void uploadFile(File file,
String fileKey,
String fileName,
String fileType,
String BOUNDARY,
OutputStream outputStream,
boolean isLast) throws IOException {
//准备数据
StringBuilder headerSbInfo = new StringBuilder();
headerSbInfo.append("--");
headerSbInfo.append(BOUNDARY);
headerSbInfo.append("\r\n");
headerSbInfo.append("Content-Disposition: form-data; name=\"" + fileKey + "\"; filename=\"" + fileName + "\"");
headerSbInfo.append("\r\n");
headerSbInfo.append("Content-Type:" + fileType);
headerSbInfo.append("\r\n");
headerSbInfo.append("\r\n");
byte[] headerInfoBytes = headerSbInfo.toString().getBytes("UTF-8");
outputStream.write(headerInfoBytes);
//文件内容
FileInputStream fos = new FileInputStream(file);
BufferedInputStream bfi = new BufferedInputStream(fos);
byte[] buffer = new byte[1024];
int len;
while ((len = bfi.read(buffer, 0, buffer.length)) != -1) {
outputStream.write(buffer, 0, len);
}
//写尾部信息
StringBuilder footerSbInfo = new StringBuilder();
footerSbInfo.append("\r\n");
footerSbInfo.append("--");
footerSbInfo.append(BOUNDARY);
if (isLast) {
footerSbInfo.append("--");
footerSbInfo.append("\r\n");
}
footerSbInfo.append("\r\n");
outputStream.write(footerSbInfo.toString().getBytes("UTF-8"));
}
}).start();
}

仔细看,其实有点复杂。这里解释一下:

首先我们要先设置把本地的一张图设置为File类,而后设置连接的参数。之后是上传的方法 可以看到,我们上传文件的方法也是一个字符串拼接,不过拼接的是一种固定格式,我们需要按照规定的格式拼接好才能让我们的服务器识别并上传。之后将图片转换成二进制文件进行读取,之后再拼接尾部格式。之后便是返回结果了。我们通过返回结果来看看是否上传成功,之后在自己的文件夹下看看是否有文件即可。

文件下载

和上传文件相比,下载文件就没有那么复杂了,如下代码:

   public void downloadFile(View v) {
new Thread(new Runnable() {
FileOutputStream fileOutputStream = null;
InputStream inputStream = null;
@Override
public void run() {
try {
URL url = new URL(BASE_URL + "/download/10");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(10000);
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
httpURLConnection.setRequestProperty("Accept", "*/*");
httpURLConnection.connect();
int responseCode = httpURLConnection.getResponseCode();
Log.d(TAG,"responseCode ==>"+responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) {
Map<String, List<String>> headerFields = httpURLConnection.getHeaderFields();
for (Map.Entry<String, List<String>> stringListEntry : headerFields.entrySet()) {
Log.d(TAG,stringListEntry.getKey() +"==="+stringListEntry.getValue());
}
String headerField = httpURLConnection.getHeaderField("Content-disposition");
Log.d(TAG,"headerField -->"+headerField);
// int index = headerField.indexOf("filename=");
// String fileName = headerField.substring(index + "filename=".length());
// Log.d(TAG,"fileName ==>"+fileName);
String fileName = headerField.replace("attachment; filename=", "");
Log.d(TAG,"fileName ==>"+fileName);
File picFile = RequestTestActivity.this.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
if (!picFile.exists()) {
picFile.mkdirs();
}
File file = new File(picFile+fileName);
if(!file.exists()){
file.createNewFile();
} fileOutputStream = new FileOutputStream(file);
inputStream = httpURLConnection.getInputStream();
byte[] buffer = new byte[1024];
int len;
while((len = inputStream.read(buffer,0,buffer.length)) != -1){
fileOutputStream.write(buffer,0,len);
}
fileOutputStream.flush(); }
} catch (Exception e) {
e.printStackTrace();
}finally {
if (inputStream != null) {
IOUtils.ioClose(inputStream);
}
if (fileOutputStream != null) {
IOUtils.ioClose(fileOutputStream);
}
}
}
}).start();
}

我们从服务器请求回文件,然后获取路径,新建文件和路径,然后存储进去即可。

总结

使用java API的编程操作到这里就先告一段落了,可以看到通过原生API编程的不易啊,后面我们马上学习框架使用和线程管理,就更能体会到框架的好处了。

最新文章

  1. MYSQL、PHP基础、面向对象基础简单复习总结
  2. jQuery 2.0.3 源码分析 回溯魔法 end()和pushStack()
  3. C# WinForm程序向datagridview里添加数据
  4. C# 特性Attributes 和反射
  5. Leetcode#71 Simplify Path
  6. 【Android】Android ListViewAnimations分析
  7. 谈谈SpringMVC Validation
  8. 2016最新Java笔试题集锦
  9. 转载:JAVA 正则表达式 (超详细)
  10. Gridview BottomPagerRow添加自定义控件
  11. vsftpd,tftp安装配置
  12. 常见排序算法及Java实现
  13. 关于Android SDK Manager无法更新的解决办法
  14. Java遍历Map的4种方式
  15. AspNetCore.FileLog 一款很不错的日志记录工具
  16. Android为TV端助力 最简单的自定义圆点view
  17. 1: unit test
  18. (网页)jQuery的时间datetime控件在AngularJs中使用实例
  19. MATLAB检查指定路径中的子文件夹中的文件名中是否带有空格
  20. C#里,如何模拟DataGridView里的一个Cell的Click事件。

热门文章

  1. Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&amp;方法的结构重复问题&amp;泛型:结构复用利器
  2. element UI排坑记(一):判断tabs组件是否切换
  3. rabbitMQ消息队列原理
  4. 码云git本地仓库链接远程仓库
  5. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
  6. JAVA大数几算--HDU 2054 A == B ?
  7. 从0开始搭建精灵宝可梦的检测APP
  8. Effective C++学习记录
  9. Linux中的程序和进程,PID和PPID
  10. 全面解读 vue3.0