项目中常常会用到网络请求的工具类,大多数其实都是可以自定义的,如果嫌麻烦的话,也可以直接使用我的,如有错误还请见谅!
/**
* Author : 马占柱
* E-mail : mazhanzhu_3351@163.com
* Time : 2022/1/21 14:09
* Desc : 网络请求
*/
public class Http_Net {
public static final String TAG = "";
//使用volatile关键字保其可见性
volatile private static Http_Net instance = null;
private SimpleArrayMap<String, List<Cookie>> map = new SimpleArrayMap<>();
private Http_Net() {
}
public static Http_Net getInstance() {
try {
if (instance == null) {//懒汉式
//创建实例之前可能会有一些准备性的耗时工作
Thread.sleep(300);
synchronized (Http_Net.class) {
if (instance == null) {//二次检查
instance = new Http_Net();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return instance;
}
/**
* 缓存文件
*/
private final String RESPONSE_CACHE_FILE = "responseCache";
/**
* 缓存大小
*/
private final long RESPONSE_CACHE_SIZE = 10 * 1024 * 1024L;
private String baseUrl;
private NetInterface netInterface;
public NetInterface getUrls() {
netInterface = getRetrofit("https://v1.hitokoto.cn").create(NetInterface.class);//NetInterface为接口定义类
return netInterface;
}
private Retrofit getRetrofit(String baseUrl) {
/*BaseUrl 一般网络请求地址里面,总会有一样得前缀,就像是
http://192.168.20.241:11008****这就是那个基地址,基地址+NetInterface类里面的
post()的地址就是一个完整的网络请求地址,这点要注意*/
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)//添加网络请求的基地址
.addConverterFactory(ScalarsConverterFactory.create())//增加返回值为String的支持
.addConverterFactory(GsonConverterFactory.create())//添加转换工厂,用于解析json并转化为javaBean
.client(getHttpClient())//设置参数
.build();
return mRetrofit;
}
//配置网络请求参数
private OkHttpClient getHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
HttpLogging interceptor = new HttpLogging("mzz");
interceptor.setColorLevel(Level.INFO);
if (BaseApp.isApkInDebug()) {//是否是Debug模式
interceptor.setPrintLevel(HttpLogging.Level.BODY);
Log_Ma.setIsShow(true);
builder.readTimeout(180, TimeUnit.SECONDS);
builder.writeTimeout(180, TimeUnit.SECONDS);
builder.connectTimeout(180, TimeUnit.SECONDS);
} else {
interceptor.setPrintLevel(HttpLogging.Level.NONE);
Log_Ma.setIsShow(false);
builder.readTimeout(60, TimeUnit.SECONDS);
builder.writeTimeout(60, TimeUnit.SECONDS);
builder.connectTimeout(60, TimeUnit.SECONDS);
}
File cacheFile = new File(BaseApp.getContext().getCacheDir(), RESPONSE_CACHE_FILE);//缓存文件
builder.cache(new Cache(cacheFile, RESPONSE_CACHE_SIZE))//设置用于读取和写入缓存的响应的响应缓存
.sslSocketFactory(getSSLSocketFactory(), new CustomTrustManager())//信任所有https请求
.hostnameVerifier(getHostnameVerifier())//设置用于确认响应证书应用于HTTPS连接请求的主机名的验证器。
.cookieJar(new CookieJar() {
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
map.put(url.toString(), cookies);
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = map.get(url.toString());
return cookies != null ? cookies : new ArrayList<>();
}
})
.addInterceptor(interceptor)//使用日志拦截器
.proxy(Proxy.NO_PROXY);//不使用代理的模式
OkHttpClient client = builder.build();
return client;
}
private SSLSocketFactory getSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new CustomTrustManager()}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}
return ssfFactory;
}
private class CustomTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
private HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = (hostname, session) -> true;
return hostnameVerifier;
}
}
这是上面“ScalarsConverterFactory.create()”和“GsonConverterFactory.create()”用到的依赖库
"retrofit" : "com.squareup.retrofit2:retrofit:2.9.0"
"converter-gson" : "com.squareup.retrofit2:converter-gson:2.9.0"
"converter-scalars" : "com.squareup.retrofit2:converter-scalars:2.9.0"
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
这是NetInterface类,就是retrofit的辅助接口类
/**
* Created by mazhanzhu on 2019/1/28.
*/
public interface NetInterface {
/**
* 车辆核查历史
*/
@POST("/InfoCheck_Srv_esb/oc")
@FormUrlEncoded
Call<String> getCheckCarHistroy(@FieldMap Map<String, String> map);
}
在需要的网络请求的地方这样写
Map<String, String> map = new HashMap<String, String>();
map.put("CPH", car_num);
map.put("staffCode", Hawk.get(Constant.STAFF_ID) + "");
map.put("PAGENUM", page + "");
//合起来之后完整的网络请求地址就是 http://192.168.20.241:11008/InfoCheck_Srv_esb/oc
RetrofitUtils_Ma.getUrls().getCheckCarHistroy(map).enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
日志拦截器
/**
* Author : 马占柱
* E-mail : mazhanzhu_3351@163.com
* Time : 2022/1/21 14:44
* Desc : 日志拦截器
*/
public class HttpLogging implements Interceptor {
public static final String TAG = "HttpLoggingInterceptor";
private static final Charset UTF8 = Charset.forName("UTF-8");
private volatile HttpLogging.Level printLevel;
private java.util.logging.Level colorLevel;
private Logger logger;
public HttpLogging(String tag) {
this.printLevel = HttpLogging.Level.NONE;
this.logger = Logger.getLogger(tag);
}
public void setPrintLevel(HttpLogging.Level level) {
if (this.printLevel == null) {
throw new NullPointerException("printLevel == null. Use Level.NONE instead.");
} else {
this.printLevel = level;
}
}
public void setColorLevel(java.util.logging.Level level) {
this.colorLevel = level;
}
private void log(String message) {
this.logger.log(this.colorLevel, message);
}
public Response intercept(Chain chain) throws IOException {
// FIXME: 2022/1/21 添加请求头的一种方式 如果不用的话,直接用Request request = chain.request();
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
.header("platform", "platform")//平台
.header("sysVersion", "sysVersion")//系统版本号
.header("device", "device")//设备信息
.header("screen", "screen")//屏幕大小
.header("uuid", "uuid")//设备唯一码
.header("version", "version")//app版本
.header("apiVersion", "apiVersion")//api版本
.header("token", "token")//令牌
.header("channelId", "channelId")//渠道
.header("networkType", "networkType");//网络类型
Request request = requestBuilder.build();
Response proceed = chain.proceed(request);
if (this.printLevel == HttpLogging.Level.NONE) {
return proceed;
} else {
this.logForRequest(request, chain.connection());
long startNs = System.nanoTime();
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
return this.logForResponse(proceed, tookMs);
}
}
private void logForRequest(Request request, Connection connection) throws IOException {
boolean logBody = this.printLevel == HttpLogging.Level.BODY;
boolean logHeaders = this.printLevel == HttpLogging.Level.BODY || this.printLevel == HttpLogging.Level.HEADERS;
RequestBody requestBody = request.body();
boolean hasRequestBody = requestBody != null;
Protocol protocol = connection != null ? connection.protocol() : Protocol.HTTP_1_1;
try {
String requestStartMessage = "--> " + request.method() + ' ' + request.url() + ' ' + protocol;
this.log(requestStartMessage);
if (logHeaders) {
if (hasRequestBody) {
if (requestBody.contentType() != null) {
this.log("\tContent-Type: " + requestBody.contentType());
}
if (requestBody.contentLength() != -1L) {
this.log("\tContent-Length: " + requestBody.contentLength());
}
}
Headers headers = request.headers();
int i = 0;
for (int count = headers.size(); i < count; ++i) {
String name = headers.name(i);
if (!"Content-Type".equalsIgnoreCase(name) && !"Content-Length".equalsIgnoreCase(name)) {
this.log("\t" + name + ": " + headers.value(i));
}
}
this.log(" ");
if (logBody && hasRequestBody) {
if (isPlaintext(requestBody.contentType())) {
this.bodyToString(request);
} else {
this.log("\tbody: maybe [binary body], omitted!");
}
}
}
} catch (Exception var16) {
} finally {
this.log("--> END " + request.method());
}
}
private Response logForResponse(Response response, long tookMs) {
Builder builder = response.newBuilder();
Response clone = builder.build();
ResponseBody responseBody = clone.body();
boolean logBody = this.printLevel == HttpLogging.Level.BODY;
boolean logHeaders = this.printLevel == HttpLogging.Level.BODY || this.printLevel == HttpLogging.Level.HEADERS;
try {
this.log("<-- " + clone.code() + ' ' + clone.message() + ' ' + clone.request().url() + " (" + tookMs + "ms)");
if (logHeaders) {
Headers headers = clone.headers();
int i = 0;
for (int count = headers.size(); i < count; ++i) {
this.log("\t" + headers.name(i) + ": " + headers.value(i));
}
this.log(" ");
if (logBody && HttpHeaders.hasBody(clone)) {
if (responseBody == null) {
Response var20 = response;
return var20;
}
if (isPlaintext(responseBody.contentType())) {
byte[] bytes = toByteArray(responseBody.byteStream());
MediaType contentType = responseBody.contentType();
String body = new String(bytes, getCharset(contentType));
this.log("\tbody:" + body);
responseBody = ResponseBody.create(responseBody.contentType(), bytes);
Response var13 = response.newBuilder().body(responseBody).build();
return var13;
}
this.log("\tbody: maybe [binary body], omitted!");
}
}
} catch (Exception var17) {
Log.e(TAG, "logForResponse: " + var17.toString());
} finally {
this.log("<-- END HTTP");
}
return response;
}
private static Charset getCharset(MediaType contentType) {
Charset charset = contentType != null ? contentType.charset(UTF8) : UTF8;
if (charset == null) {
charset = UTF8;
}
return charset;
}
private static boolean isPlaintext(MediaType mediaType) {
if (mediaType == null) {
return false;
} else if (mediaType.type() != null && mediaType.type().equals("text")) {
return true;
} else {
String subtype = mediaType.subtype();
if (subtype != null) {
subtype = subtype.toLowerCase();
if (subtype.contains("x-www-form-urlencoded") || subtype.contains("json") || subtype.contains("xml") || subtype.contains("html")) {
return true;
}
}
return false;
}
}
private void bodyToString(Request request) {
try {
Request copy = request.newBuilder().build();
RequestBody body = copy.body();
if (body == null) {
return;
}
Buffer buffer = new Buffer();
body.writeTo(buffer);
Charset charset = getCharset(body.contentType());
this.log("\tbody:" + buffer.readString(charset));
} catch (Exception var6) {
Log.e(TAG, "bodyToString: " + var6.toString());
}
}
public static enum Level {
NONE,
BASIC,
HEADERS,
BODY;
private Level() {
}
}
private static byte[] toByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
write((InputStream) input, (OutputStream) output);
output.close();
return output.toByteArray();
}
private static void write(InputStream inputStream, OutputStream outputStream) throws IOException {
byte[] buffer = new byte[4096];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
}
}
搞定!