1. retrofit2客户端封装
public class RetrofitClient {
private String baseUrl;
private long readTimeout = 10000;
private long connectTimeout = 10000;
public RetrofitClient(String baseUrl) {
this.baseUrl = baseUrl;
}
public void setReadTimeout(long readTimeout) {
this.readTimeout = readTimeout;
}
public void setConnectTimeout(long connectTimeout) {
this.connectTimeout = connectTimeout;
}
public Retrofit get(Interceptor... interceptors) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.readTimeout(readTimeout, TimeUnit.MILLISECONDS)
.connectTimeout(connectTimeout, TimeUnit.MILLISECONDS);
for (Interceptor interceptor : interceptors) {
builder.addInterceptor(interceptor);
}
OkHttpClient okHttpClient = builder
.build();
return new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(convertFactory())
.build();
}
private Converter.Factory convertFactory() {
return new Converter.Factory() {
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
return new Converter<ResponseBody, Object>() {
@EverythingIsNonNull
@Override
public Object convert(ResponseBody value) throws IOException {
BufferedSource bufferedSource = Okio.buffer(value.source());
String tempStr = bufferedSource.readUtf8();
bufferedSource.close();
return JSON.parseObject(tempStr, type);
}
};
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return new Converter<Object, RequestBody>() {
private final MediaType mediaType = MediaType.parse("application/json; charset=UTF-8");
@EverythingIsNonNull
@Override
public RequestBody convert(Object value) {
return RequestBody.create(mediaType, JSON.toJSONBytes(value));
}
};
}
};
}
2. retrofit2接口使用
public interface PaymentApi {
@Headers({"Content-Type: application/json"})
@POST("/pay")
Call<JSONObject> pay(@Body RequestDto request);
@Headers({"Content-Type: application/json"})
@GET("/payments/{id}")
Call<JSONObject> getDetails(@Url String id);
}
3.客户端调用
public JSONObject pay(CheckoutPaymentRequestDto request) {
PaymentApi paymentApi = new RetrofitClient(Constants.CHECKOUT_BASEURL).get(chain -> {
Request req = chain.request()
.newBuilder()
.header(Constants.ECRET_HEADER, Constants.SECRET).build();
return chain.proceed(req);
}).create(PaymentApi.class);
logger.info("checkout 请求开始,参数{}", JSON.toJSONString(request));
Call<JSONObject> call = paymentApi.pay(request);
//获取返回数据业务处理逻辑
return null;
}