零、前言
安卓的网络编程,服务端的知识是必不可少的,否则不知道该请求什么url,或不明白服务端是什么样的,总像是拼图少了一半
还好本人会些SpringBoot压箱底,这里提供了可访问的URL供大家测试,以及后端的具体实现的链接,感兴趣的可以看一下
本文安卓端
基本上是根据慕课网上hyman的
Android网络框架-OkHttp使用 敲的,懒得看文章的可以去看看视频
不过版本OKHttp3.X和视频中2.X稍有不同,还有本文服务端使用SpringBoot与视频不同
本文测试的url为已在服务器上,可访问:
GET请求测试地址:http://www.toly1994.com:8089/swords/find/21
POST请求测试地址:http://www.toly1994.com:8089/swords/postFind 参数:id=26
具体url的创建方法可详见:SpringBoot篇:SpringBoot-07-之数据库JPA(CRUD)
POST请求体中添加文本:http://www.toly1994.com:8089/PostString
具体url的创建方法可详见:SpringBoot篇:SpringBoot-02-之参数传递
POST请求体中上传文件:http://www.toly1994.com:8089/PostFile
通过模拟表单上传文件:http://www.toly1994.com:8089/upload
具体url的创建方法可详见:SpringBoot篇:SpringBoot-02-之参数传递
依赖
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
一、GET请求
注:回调的Callback在子线程执行,不能更新UI
private void doGet() {
//1.获取OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.获取Request对象
Request request = new Request.Builder().get().url("http://www.baidu.com").build();
//3.将Request封装为Call对象
Call call = okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e(TAG, "onResponse: " + response.body().string());
}
});
}
将访问百度的服务器,服务器返回的内容体便是百度首页的html
二、POST请求
private void doPost() {
//1.获取OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.构造RequestBody
FormBody body = new FormBody.Builder().add("id", "26").build();
Request request = new Request.Builder().url(Cons.BASE_URL+"swords/postFind").post(body).build();
//3.将Request封装为Call对象
Call call = okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.e(TAG, "onResponse: " + result);
runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));
}
});
}
三、POST请求的请求体中添加文本
private void doPostStr() {
//1.获取OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.构造RequestBody
RequestBody body = RequestBody.create(MediaType.parse("text/plain;chaset=utf-8"),
"轻轻的我走了,\n" +
"正如我轻轻的来;\n" +
"我轻轻的招手,\n" +
"作别西天的云彩。\n" +
"\n" +
"那河畔的金柳,\n" +
"是夕阳中的新娘;\n" +
"波光里的艳影,\n" +
"在我的心头荡漾。\n);
Request request = new Request.Builder().url(Cons.BASE_URL+"PostString").post(body).build();
//3.将Request封装为Call对象
Call call = okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.e(TAG, "onResponse: " + result);
runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));
}
});
}
四、通过流传输文件
private void doPostFile() {
File file = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera/iv_500x400.png");
//1.获取OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.构造Request--任意二进制流:application/octet-stream
Request request = new Request.Builder()
.url(Cons.BASE_URL + "PostFile")
.post(RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();
//3.将Request封装为Call对象
Call call = okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.e(TAG, "onResponse: " + result);
runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));
}
});
}
五、通过模拟表单上传文件:MultipartBody
/**
* 模拟表单上传文件:通过MultipartBody
*/
private void doUpload() {
File file = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera/iv_500x400.png");
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
//1.获取OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.获取Request对象
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "test.jpg", fileBody)
.build();
Request request = new Request.Builder()
.url(Cons.BASE_URL + "upload")
.post(requestBody).build();
//3.将Request封装为Call对象
Call call = okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.e(TAG, "onResponse: " + result);
runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));
}
});
}
六、下载文件:
private void doDownload() {
//1.获取OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.获取Request对象
Request request = new Request.Builder().get().url(Cons.BASE_URL + "imgs/test.jpg").build();
//3.将Request封装为Call对象
Call call = okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
File file = new File(Environment.getExternalStorageDirectory(), "download.jpg");
InputStream is = response.body().byteStream();
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[102];
int len = 0;
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
is.close();
}
});
}
七、在安卓端显示图片:
有了流,一切都好办:
response.body().byteStream()
关于Bitmap的预处理等操,这里就不多说了,有兴趣的可见1-MI-Android多媒体之Bitmap:
private void showImg() {
//1.获取OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.获取Request对象
Request request = new Request.Builder().get().url(Cons.BASE_URL + "imgs/test.jpg").build();
//3.将Request封装为Call对象
Call call = okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = response.body().byteStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
runOnUiThread(()->{
mIdIvShow.setImageBitmap(bitmap);
});
}
});
}
后记:捷文规范
1.本文成长记录及勘误表
项目源码 | 日期 | 备注 |
---|---|---|
V0.1--无 | 2018-10-20 | 5--安卓网络编程之OKHttp3的使用 |
2.更多关于我
笔名 | 微信 | 爱好 | |
---|---|---|---|
张风捷特烈 | 1981462002 | zdl1994328 | 语言 |
我的github | 我的简书 | 我的CSDN | 个人网站 |
3.声明
1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持