当前位置: 代码迷 >> 综合 >> 基于okhttp, 如何封装一个requestbody, 同样能在retrofit中使用
  详细解决方案

基于okhttp, 如何封装一个requestbody, 同样能在retrofit中使用

热度:71   发布时间:2024-02-19 15:02:20.0

如何封装一个比较好的请求,减去每次请求的重新生成, json的构建.post, get的参数拼接

采用了builder的建造者设计模式.

简单化的做一个body的构建工厂.

通过泛型.进行整合.

        protected final Map<String, Object> params = new HashMap<String, Object>();protected final Map<String, String> header = new HashMap<String, String>();protected String url;public T add(String key, Object value) {params.put(key, value);return (T) this;}public T url(String url) {this.url = url;return (T) this;}public T addHeader(String name, String value) {header.put(name, value);return (T) this;}

此方法可以放在父类中,

body的构建不同而产生不同的builder,最终返回都是requestBody

父类改造

   private abstract static class BodyBuilder<T> {protected final Map<String, Object> params = new HashMap<String, Object>();protected final Map<String, String> header = new HashMap<String, String>();protected String url;public T add(String key, Object value) {params.put(key, value);return (T) this;}public T url(String url) {this.url = url;return (T) this;}public T addHeader(String name, String value) {header.put(name, value);return (T) this;}public abstract Request build();}

首先是一个post请求, 那么, post请求一般传递的参数基本都是json. 

通过泛型进行处理只用构建一个单独的builder即可. 可以产生链式调用

    public static class JsonBodyBuilder extends BodyBuilder<JsonBodyBuilder> {@Overridepublic Request build() {RequestBody body;if (params.size() > 0) {body = FormBody.create(MediaType.parse(Global.CONTENT_TYPE), JSONObject.toJSONString(params));}else {body = FormBody.create(null, "");}Request.Builder builder = new Request.Builder().url(this.url).post(body);if (header.size() > 0) {for (String key : header.keySet()) {builder.addHeader(key, header.get(key));}}return builder.build();}}

调用例子如下

  Request request = new RequestBodyFactory.JsonBodyBuilder().add("params", phone).url(url).build();

获得request可以用来请求..

get方法也是同理

public static class GetBodyBuilder extends BodyBuilder<GetBodyBuilder> {@Overridepublic Request build() {if (StringUtils.isBlank(this.url)) {throw new CamelliaException(ExceptionEnum.SYSTEM_UNKNOWN_FAILED);}Request.Builder builder = new Request.Builder();HttpUrl httpUrl = HttpUrl.parse(this.url);if (httpUrl == null) {throw new CamelliaException(ExceptionEnum.SYSTEM_UNKNOWN_FAILED);}HttpUrl.Builder httpUrlBuilder = httpUrl.newBuilder();if (this.params.size() > 0) {for (String key : this.params.keySet()) {httpUrlBuilder.addQueryParameter(key, String.valueOf(this.params.get(key)));}}builder.url(httpUrlBuilder.build());if (header.size() > 0) {for (String key : header.keySet()) {builder.addHeader(key, header.get(key));}}return builder.build();}}

调用例子如下

 Request request = new RequestBodyFactory.GetBodyBuilder().add("params", params).url(url).build();

同样表单请求也可以这样封装.通过链式调用,自动拼接url. 自动生成json