一、OkHttp的封装
(1)创建JSON回调
public abstract class NetworkCallback implements Callback {
public abstract void onError(Call call, String e);
public abstract void onResponse(JSONObject response, int id);
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
onError(call, e.toString());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
assert response.body() != null;
final String response_body = response.body().string();
try {
JSONObject jsonObject = new JSONObject(response_body);
onResponse(jsonObject, response.code());
} catch (JSONException e) {
onError(call, e.toString());
}
}
}
(2)创建下载文件回调
public abstract class NetworkCallbackFile implements Callback {
private String destFileDir;
private String destFileName;
public NetworkCallbackFile(String destFileDir, String destFileName) {
this.destFileDir = destFileDir;
this.destFileName = destFileName;
}
public abstract void onError(Call call, String e);
public abstract void onResponse(File response, int id);
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
onError(call, e.toString());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
onResponse(saveFile(response), response.code());
}
public File saveFile(Response response) throws IOException {
InputStream is = null;
byte[] buf = new byte[2048];
int len;
FileOutputStream fos = null;
try {
assert response.body() != null;
is = response.body().byteStream();
File dir = new File(destFileDir);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, destFileName);
fos = new FileOutputStream(file);
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
return file;
} finally {
try {
assert response.body() != null;
response.body().close();
if (is != null) is.close();
} catch (IOException ignored) {
}
try {
if (fos != null) fos.close();
} catch (IOException ignored) {
}
}
}
}
(3)网络请求封装
public class OkHttpUtils {
private OkHttpClient client;
private static OkHttpUtils instance;
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public OkHttpUtils() {
client = new OkHttpClient();
}
public static OkHttpUtils get() {
if (instance == null) {
instance = new OkHttpUtils();
}
return instance;
}
public void post(final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
post(null, url, token, params, callback);
}
public void post(Context context, final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
FormBody.Builder builder = new FormBody.Builder();
if (params != null && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
}
Request request;
//发起request
if (context == null) {
request = new Request.Builder()
.url(url)
.addHeader("token", token)
.post(builder.build())
.build();
} else {
request = new Request.Builder()
.url(url)
.addHeader("token", token)
.post(builder.build())
.tag(context)
.build();
}
client.newCall(request).enqueue(callback);
}
public void get(final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
get(null, url, token, params, callback);
}
public void get(Context context, final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
//拼接url
StringBuilder get_url = new StringBuilder(url);
if (params != null && params.size() > 0) {
int i = 0;
for (Map.Entry<String, String> entry : params.entrySet()) {
if (i++ == 0) {
get_url.append("?").append(entry.getKey()).append("=").append(entry.getValue());
} else {
get_url.append("&").append(entry.getKey()).append("=").append(entry.getValue());
}
}
}
Request request;
//发起request
if (context == null) {
request = new Request.Builder()
.url(url)
.addHeader("token", token)
.build();
} else {
request = new Request.Builder()
.url(url)
.addHeader("token", token)
.tag(context)
.build();
}
client.newCall(request).enqueue(callback);
}
public void uploadFiles(String url, Map<String, File> files, final NetworkCallback callback) {
uploadFiles(null, url, null, files, callback);
}
public void uploadFiles(String url, Map<String, String> params, Map<String, File> files, final NetworkCallback callback) {
uploadFiles(null, url, params, files, callback);
}
public void uploadFiles(Context context, String url, Map<String, File> files, final NetworkCallback callback) {
uploadFiles(context, url, null, files, callback);
}
public void uploadFiles(Context context, String url, Map<String, String> params, Map<String, File> files, final NetworkCallback callback) {
MultipartBody.Builder multipartBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
//添加参数
if (params != null && !params.isEmpty()) {
for (String key : params.keySet()) {
multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
RequestBody.create(null, Objects.requireNonNull(params.get(key))));
}
}
//添加上传文件
if (files != null && !files.isEmpty()) {
RequestBody fileBody;
for (String key : files.keySet()) {
File file = files.get(key);
assert file != null;
String fileName = file.getName();
fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
multipartBuilder.addPart(
Headers.of("Content-Disposition", "form-data; name=\"" + key + "\"; filename=\"" + fileName + "\""),
fileBody);
}
}
Request request;
if (context == null) {
request = new Request.Builder()
.url(url)
.post(multipartBuilder.build())
.build();
} else {
request = new Request.Builder()
.url(url)
.post(multipartBuilder.build())
.tag(context)
.build();
}
client.newCall(request).enqueue(callback);
}
public void downloadFiles(String url, final NetworkCallbackFile callback) {
downloadFiles(null, url, callback);
}
public void downloadFiles(Context context, String url, final NetworkCallbackFile callback) {
Request request;
if (context == null) {
request = new Request.Builder()
.url(url)
.build();
} else {
request = new Request.Builder()
.url(url)
.tag(context)
.build();
}
client.newCall(request).enqueue(callback);
}
public void cancel(Context context) {
if (client != null) {
for (Call call : client.dispatcher().queuedCalls()) {
if (Objects.equals(call.request().tag(), context))
call.cancel();
}
for (Call call : client.dispatcher().runningCalls()) {
if (Objects.equals(call.request().tag(), context))
call.cancel();
}
}
}
private String guessMimeType(String path) {
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String contentTypeFor = null;
try {
contentTypeFor = fileNameMap.getContentTypeFor(URLEncoder.encode(path, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (contentTypeFor == null) {
contentTypeFor = "application/octet-stream";
}
return contentTypeFor;
}
}
网友评论