OkHttp框架从3.0开始简化了Cookie的使用,它提供了一个叫做cookieJar的API,只需要我们实现该API中的方法即可.
HttpUtls.java
package xueqing.com.okhttpcookiedemo;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Created by XueQing Wang on 2018/10/20.
*/
public class HttpUtils {
private static final String TAG = "<HttpUtils>-----";
private static HttpUtils httpUtils;
private final int SUCCESS = 200;
private final int ERROR = 500;
private MyHandler myHandler = new MyHandler();
private OkLoadListener okLoadListener;
public static final String server = "http://*.*.*.*/ProjectName/";
private HttpUtils(){}
public static HttpUtils getHttpUtils() {
if (httpUtils == null) {
httpUtils = new HttpUtils();
}
return httpUtils;
}
private OkHttpClient okHttpClient;
{
okHttpClient = new OkHttpClient.Builder()
.cookieJar(new CookieJar() {
private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url, cookies);
cookieStore.put(HttpUrl.parse(server), cookies);
for (Cookie cookie : cookies) {
Log.i("cookie Name:", cookie.name());
Log.i("cookie Path", cookie.path());
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(HttpUrl.parse(server));
if (cookies == null) {
Log.e(TAG, "没加载到cookie");
}
return cookies != null ? cookies : new ArrayList<Cookie>();
}
}).addInterceptor(new MyIntercepter()).build();
}
interface OkLoadListener {
void okLoadSuccess(String success);
void okLoadError(String error);
}
public void setOkLoadListener(OkLoadListener okLoadListener) {
this.okLoadListener = okLoadListener;
}
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS:
//成功
String json = (String) msg.obj;
okLoadListener.okLoadSuccess(json);
break;
case ERROR:
//失败
String error = (String) msg.obj;
okLoadListener.okLoadError(error);
break;
}
}
}
//get
public void okGet(String url) {
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = myHandler.obtainMessage();
message.what = ERROR;
message.obj = e.getMessage();
myHandler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = myHandler.obtainMessage();
message.what = SUCCESS;
message.obj = response.body().string();
myHandler.sendMessage(message);
}
});
}
//post
public void okPost(String url, Map<String, String> params) {
FormBody.Builder builder = new FormBody.Builder();
Set<String> keySet = params.keySet();
for (String key : keySet) {
String value = params.get(key);
builder.add(key, value);
}
FormBody formBody = builder.build();
Request request = new Request.Builder().url(url).post(formBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = myHandler.obtainMessage();
message.what = ERROR;
message.obj = e.getMessage();
myHandler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = myHandler.obtainMessage();
message.what = SUCCESS;
message.obj = response.body().string();
myHandler.sendMessage(message);
}
});
}
//拦截器
class MyIntercepter implements Interceptor {
//intercept 拦截
@Override
public Response intercept(Chain chain) throws IOException {
//添加公共参数
// post 取出原来所有的参数,将之加到新的请求体里面。然后让请求去执行
Request request = chain.request();
//获取请求方法
String method = request.method();
if (method.equals("GET")) {//---------------------------GET 拦截
//取出url地址
String url = request.url().toString();
//拼接公共参数
boolean contains = url.contains("?");
if (contains) {
url = url + "&source=android";
} else {
url = url + "?source=android";
}
Request request1 = request.newBuilder().url(url).build();
Response response = chain.proceed(request1);
return response;
} else if (method.equals("POST")) {//---------------------POST 拦截
RequestBody body = request.body();//请求体
if (body instanceof FormBody) {
//创建新的请求体
FormBody.Builder newBuilder = new FormBody.Builder();
for (int i = 0; i < ((FormBody) body).size(); i++) {
String key = ((FormBody) body).name(i);
String value = ((FormBody) body).value(i);
newBuilder.add(key, value);
}
//添加公共参数
newBuilder.add("source", "android");
FormBody newBody = newBuilder.build();
//创建新的请求体
Request request1 = request.newBuilder().post(newBody).build();
//去请求
Response response = chain.proceed(request1);
return response;
}
}
return null;
}
}
//上传文件(图片)
public void upLoadImage(String url, String path) {//url 要上传的地址。path 要上传的文件路径
//媒体类型
MediaType mediaType = MediaType.parse("image/*");
//multipartbody
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
File file = new File(path);
MultipartBody multipartBody = builder.addFormDataPart("file", file.getName(), RequestBody.create(mediaType, file)).build();
Request request = new Request.Builder().url(url).post(multipartBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "上传失败0----: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "上传成功: ");
}
});
}
}
使用方式
package xueqing.com.okhttpcookiedemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.HashMap;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import okhttp3.OkHttpClient;
/**
* Created by XueQing Wang on 2018/10/20.
*/
public class MainActivity extends AppCompatActivity {
@BindView(R.id.btn_login)
Button btnLogin;
@BindView(R.id.btn_get)
Button btnGet;
private HttpUtils httpUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
httpUtils = HttpUtils.getHttpUtils();
}
@OnClick({R.id.btn_login, R.id.btn_get})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_login:
login();
break;
case R.id.btn_get:
get();
break;
}
}
private void login() {
httpUtils.setOkLoadListener(new HttpUtils.OkLoadListener() {
@Override
public void okLoadSuccess(String success) {
Toast.makeText(MainActivity.this, success, Toast.LENGTH_SHORT).show();
}
@Override
public void okLoadError(String error) {
Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
}
});
HashMap<String, String> map = new HashMap<>();
map.put("username", "admin");
map.put("password", "admin");
httpUtils.okPost(HttpUtils.server + "login",map);
}
private void get() {
httpUtils.setOkLoadListener(new HttpUtils.OkLoadListener() {
@Override
public void okLoadSuccess(String success) {
Toast.makeText(MainActivity.this, success, Toast.LENGTH_SHORT).show();
}
@Override
public void okLoadError(String error) {
Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
}
});
HashMap<String, String> map = new HashMap<>();
map.put("username", "张");
map.put("company", "郑州");
map.put("superiortype", "1");
httpUtils.okPost(HttpUtils.server+"list",map);
}
}