package com.fanxin.huangfangyi.main.utils;
import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.fanxin.huangfangyi.DemoHelper;
import java.io.File;
import java.io.IOException;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Created by huangfangyi/qq84543217 on 2016/6/30.
*/
public class OkHttpManager {
public static Context context;
public static OkHttpManager serverTask;
private static OkHttpClient okHttpClient;
private static final int RESULT_ERROR = 1000;
private static final int RESULT_SUCESS = 2000;
private HttpCallBack httpCallBack;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int reusltCode = msg.what;
switch (reusltCode) {
case RESULT_ERROR:
httpCallBack.onFailure((String) msg.obj);
Toast.makeText(context, "服务器端无响应", Toast.LENGTH_SHORT).show();
Log.d("result----->", (String) msg.obj);
break;
case RESULT_SUCESS:
String result = (String) msg.obj;
try {
JSONObject jsonObject = JSONObject.parseObject(result);
httpCallBack.onResponse(jsonObject);
} catch (JSONException e) {
httpCallBack.onFailure((String) msg.obj);
Toast.makeText(context, "响应数据解析错误", Toast.LENGTH_SHORT).show();
}
Log.d("result----->", result);
break;
}
}
};
public OkHttpManager(Context context) {
this.context = context;
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000L, TimeUnit.MILLISECONDS)
.readTimeout(10000L, TimeUnit.MILLISECONDS)
//其他配置
.build();
}
public static synchronized void init(Context context) {
if (serverTask == null) {
serverTask = new OkHttpManager(context);
}
}
public static OkHttpManager getInstance() {
if (serverTask == null) {
throw new RuntimeException("please init first!");
}
return serverTask;
}
//纯粹键值对post请求
public void post(List<Param> params, String url, HttpCallBack httpCallBack) {
Log.d("url----->>", url);
this.httpCallBack = httpCallBack;
FormBody.Builder bodyBulder = new FormBody.Builder();
for (Param param : params) {
bodyBulder.add(param.getKey(), param.getValue());
Log.d("param.getKey()----->>", param.getKey());
Log.d("param.getValue()----->>", param.getValue());
}
RequestBody requestBody = bodyBulder.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
startRequest(request);
}
//键值对+文件 post请求
public void post(List<Param> params, List<File> files, String url, HttpCallBack httpCallBack) {
Log.d("url----->>", url);
this.httpCallBack = httpCallBack;
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
for (Param param : params) {
builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + param.getKey() + "\""), RequestBody.create(MediaType.parse(guessMimeType(param.getKey())), param.getValue()));
Log.d("param.getKey()----->>", param.getKey());
Log.d("param.getValue()----->>", param.getValue());
}
for (File file : files) {
if (file != null && file.exists()) {
//TODO-本项目固化文件的键名为“file”
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"" + "file" + "\"; filename=\"" + file.getName()+ "\""),
RequestBody.create(MediaType.parse(guessMimeType(file.getName())), file));
Log.d("file.getName()----->>", file.getName());
}
}
RequestBody requestBody = builder.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
startRequest(request);
}
//键值对+文件 post请求
public void postMoments(List<Param> params, List<Uri> images, String url, HttpCallBack httpCallBack) {
Log.d("url----->>", url);
this.httpCallBack = httpCallBack;
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
int num = images.size();
String imageStr="0";
for (int i = 0; i < num; i++) {
String imageUrl = images.get(i).getPath();
String filename = imageUrl.substring(imageUrl
.lastIndexOf("/") + 1);
File file = new File("/sdcard/bizchat/" + filename);
File file_big = new File("/sdcard/bizchat/" + "big_" + filename);
// if (file.exists() && file_big.exists()) {
// Log.e("imageStr_ok---->>>>>>.", "ffffff");
// } else {
// Log.e("imageStr_ok---->>>>>>.", "ggggggg");
// }
// // 小图
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"" + "file_" + String.valueOf(i) + "\"; filename=\"" + file.getName() + "\""),
RequestBody.create(MediaType.parse(guessMimeType(file.getName())), file));
// 大图
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"" + "file_" + String.valueOf(i) + "_big" + "\"; filename=\"" + file_big.getName() + "\""),
RequestBody.create(MediaType.parse(guessMimeType(file_big.getName())), file_big));
if (i == 0) {
imageStr = filename;
} else {
imageStr = imageStr + "split" + filename;
Log.e("imageStr---->>>>>>.", imageStr);
}
}
params.add(new Param("num",String.valueOf(images.size())));
params.add(new Param("imageStr",imageStr));
params.add(new Param("userID", DemoHelper.getInstance().getCurrentUsernName()));
for (Param param : params) {
builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + param.getKey() + "\""), RequestBody.create(MediaType.parse(guessMimeType(param.getKey())), param.getValue()));
Log.d("param.getKey()----->>", param.getKey());
Log.d("param.getValue()----->>", param.getValue());
}
RequestBody requestBody = builder.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
startRequest(request);
}
private void startRequest(Request request) {
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = handler.obtainMessage();
message.what = RESULT_ERROR;
message.obj = e.getMessage().toString();
message.sendToTarget();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = handler.obtainMessage();
message.what = RESULT_SUCESS;
message.obj = response.body().string();
message.sendToTarget();
}
});
}
public interface HttpCallBack {
void onResponse(JSONObject jsonObject);
void onFailure(String errorMsg);
}
private String guessMimeType(String path) {
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String contentTypeFor = fileNameMap.getContentTypeFor(path);
if (contentTypeFor == null) {
contentTypeFor = "application/octet-stream";
}
return contentTypeFor;
}
}