业无高卑志当坚,男儿有求安得闲?这篇文章主要讲述安卓网络编程学习——java原生网络编程相关的知识,希望能为你提供帮助。
写在前面
该博客紧接上篇博客: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原生网络编程】我们从服务器请求回文件,然后获取路径,新建文件和路径,然后存储进去即可。
总结
使用java API的编程操作到这里就先告一段落了,可以看到通过原生API编程的不易啊,后面我们马上学习框架使用和线程管理,就更能体会到框架的好处了。
推荐阅读
- 一致性检验指标Kappa(cappa)系数
- 3AutoMapper In Asp.net Core
- android 关联某些后缀使用app打开
- elasticsearch 的post put 方式的对比 setting mapping设置
- Android studio之广播监听接收短信
- 二十二(视图之add_url_rule和app.route)
- Android Studio采坑记录
- 分析SAN LUN Mapping出错导致文件系统共享冲突的情况
- android修改默认输入法