如何封装一个比较好的请求,减去每次请求的重新生成, 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