本文主要展示 okHttp 插件的基本用法,
主要包含
1.get方式请求数据
2.post方式请求数据
3.文件的上传
4.文件的下载
5.加载网络图片
okHttp所需的jar包:
布局文件:
布局文件很简单,就五个按钮,一个imageView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.skywalker.okhttptest.MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="123456" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HTTPGet"
android:id="@+id/httpGet"
android:layout_below="@+id/text"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HTTPPost"
android:id="@+id/httpPost"
android:layout_below="@+id/httpGet"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fileUpload"
android:id="@+id/fileUpload"
android:layout_below="@+id/httpPost"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fileDownload"
android:id="@+id/fileDownload"
android:layout_below="@+id/fileUpload"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="loadImage"
android:id="@+id/loadImage"
android:layout_below="@+id/fileDownload"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ImageView
android:layout_width="165dp"
android:layout_height="110dp"
android:id="@+id/imageView"
android:layout_below="@+id/loadImage"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
使用方法:
一、GET方式请求数据
//1.Get方式请求数据
httpGet = (Button) findViewById(R.id.httpGet);
httpGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url("http://haiws.com/")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.i("test", "fail");
}
@Override
public void onResponse(final Response response) throws IOException {
//希望获得返回的字符串,可以通过response.body().string()获取
//如果希望获得返回的二进制字节数组,则调用response.body().bytes()
//想拿到返回的inputStream,则调用response.body().byteStream()
//onResponse执行的线程并不是UI线程
String htmlStr = response.body().string();
Log.i("test", htmlStr);
}
});
}
});
二、POST方式请求数据
//2.POST方式请求数据
findViewById(R.id.httpPost).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpClient mOkHttpClient = new OkHttpClient();
FormEncodingBuilder builder = new FormEncodingBuilder();
//添加参数
builder.add("username", "czzccz");
builder.add("password", "123321");
Request request = new Request.Builder()
.url("http://jk.czlaite.com/openapi/register")
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.i("test", "fail");
}
@Override
public void onResponse(Response response) throws IOException {
Log.i("test", response.body().string());
}
});
}
});
三、上传文件
//上传文件
findViewById(R.id.fileUpload).setOnClickListener(new View.OnClickListener() {
OkHttpClient mOkHttpClient = new OkHttpClient();
@Override
public void onClick(View v) {
//创建一个文件,用于上传到服务器端
File file = new File(Environment.getExternalStorageDirectory(), "123123.txt");
if (!file.exists()) {
Log.i("test", "NO FILE");
try {
file.createNewFile();
OutputStream ous = new FileOutputStream(file);
ous.write("1234567890".getBytes());
ous.flush();
ous.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 上传文件的步骤
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
//区别POST方式请求数据 FormEncodingBuilder
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"username\""),
RequestBody.create(null, "Sky"))
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"mFile\";filename=\"123.txt\""), fileBody)
.build();
Request request = new Request.Builder()
.url("http://192.168.0.177:8080/uploadTest/simpleFileupload")
.post(requestBody)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.i("test", ",上传失败");
}
@Override
public void onResponse(Response response) throws IOException {
Log.i("test", ",上传成功");
}
//...
});
}
});
四、下载文件
//下载文件
findViewById(R.id.fileDownload).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpClient mOkHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url("http://img39.51tietu.net/pic/2017-011003/20170110030923zgwnujrdwlu107946.jpg")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.i("test", "fail");
}
@Override
public void onResponse(final Response response) throws IOException {
if (!response.isSuccessful()) {
Log.i("test", "response is not success");
return;
}
//希望获得返回的字符串,可以通过response.body().string()获取
//如果希望获得返回的二进制字节数组,则调用response.body().bytes()
//想拿到返回的inputStream,则调用response.body().byteStream()
InputStream ins = response.body().byteStream();
File file = new File(Environment.getExternalStorageDirectory(), "123.jpg");
if (!file.exists()) {
file.createNewFile();
}
OutputStream ous = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len;
while ((len = ins.read(buff)) != -1) {
ous.write(buff, 0, len);
ous.flush();
}
ous.close();
Log.i("test", "下载成功");
//测试,将下载的图片取出,设置到界面上
runOnUiThread(new Runnable() {
@Override
public void run() {
Bitmap bmp = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + "/123.jpg");
((ImageView) findViewById(R.id.imageView)).setImageBitmap(bmp);
}
});
}
});
}
});
五、为ImageView加载图片
//加载图片
findViewById(R.id.loadImage).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpClient mOkHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url("http://b.hiphotos.baidu.com/image/pic/item/0b55b319ebc4b7455203681bcdfc1e178a821523.jpg")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.i("test", "fail");
}
@Override
public void onResponse(final Response response) throws IOException {
//希望获得返回的字符串,可以通过response.body().string()获取
//如果希望获得返回的二进制字节数组,则调用response.body().bytes()
//想拿到返回的inputStream,则调用response.body().byteStream()
if (!response.isSuccessful()) {
Log.i("test", "response is not success");
}
InputStream ins = response.body().byteStream();
final Bitmap bmp = BitmapFactory.decodeStream(ins);
runOnUiThread(new Runnable() {
@Override
public void run() {
((ImageView) findViewById(R.id.imageView)).setImageBitmap(bmp);
}
});
}
});
}
});
}
}
源代码和 上传文件的服务端代码后续给出