热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android电商平台,新手入门安卓电商系统基于OkHttp3的请求封装

最近有时间闲下来做一些以前工作的复习,翻到了上次的电商项目的代码,想起了那段用别人封装不顺手,自己又不会封装的痛苦时期,所以

最近有时间闲下来做一些以前工作的复习,翻到了上次的电商项目的代码,想起了那段用别人封装不顺手,自己又不会封装的痛苦时期,所以我决定把自己最终的劳动成果记录下来,方便以后的自己来看一看现在的自己有多蠢2333.

上次是我第一次做前后端的交互,我对交互的印象只有get ,post,put,delete四种请求,但是并不知道应该怎样具体实现它们,在登录注册以及表单提交中大多使用的是post请求,所以我新建了一个接口类管理这几种数据的提交方式

public interface IHttpClient {

IResponse get(IRequest request);

/**

* json类型的post

*

* @param request

* @return

*/

IResponse post(IRequest request);

/**

* 表单类型的post

*

* @param request

* @return

*/

IResponse put(IRequest request);

IResponse delete(IRequest request);

IResponse upload_image_post(IRequest request, Map map, File file);

}

另外新建IRequest类指定请求的方式,请求头等等

public interface IRequest {

public static final String POST = "POST";

public static final String GET = "GET";

public static final String PUT = "PUT";

public static final String DELETE = "DELETE";

/**

* 请求方式

*

* @param method

*/

void setMethod(String method);

/**

* 指定请求头

*

* @param key

* @param value

*/

void setHeader(String key, String value);

/**

* 指定请求信息

*

* @param key

* @param value

*/

void setBody(String key, Object value);

/**

* 提供给执行库请求行URL

*

* @return

*/

String getUrl();

/**

* 提供给执行库请求行URL

*

* @return

*/

Map getHeader();

/**

* 请求体

*

* @return

*/

String getBody();

}

使用Gson组装请求参数

public class RequestImpl implements IRequest {

private String method = "POST";

private String url;

private Map header;

private Map body;

public RequestImpl(String url) {

/**

* 初始化公共参数和头部信息

*/

this.url = url;

header = new HashMap();

body &#61; new HashMap<>();

}

&#64;Override

public void setMethod(String method) {

this.method &#61; method;

}

&#64;Override

public void setHeader(String key, String value) {

header.put(key, value);

}

&#64;Override

public void setBody(String key, Object value) {

body.put(key, value);

}

&#64;Override

public String getUrl() {

if (GET.equals(method)) {

// 组装post请求参数

for (String key : body.keySet()) {

url &#61; url.replace("${" &#43; key &#43; "}", body.get(key).toString());

}

}

return url;

}

&#64;Override

public Map getHeader() {

return header;

}

&#64;Override

public String getBody() {

// 组装post请求参数

if (body !&#61; null) {

return new Gson().toJson(this.body, HashMap.class);

} else {

return "{}";

}

}

}

最后新建请求方法实现类&#xff0c;将四种请求全部重写&#xff0c;然后添加公共执行方法Execute

public class OkHttpClientImpl implements IHttpClient {

OkHttpClient mOkHttpClient &#61; new OkHttpClient.Builder().build();

&#64;Override

public IResponse get(IRequest request) {

/**

* 解析业务参数

*/

request.setMethod(IRequest.GET);

Map header &#61; request.getHeader();

Request.Builder builder &#61; new Request.Builder();

for (String key : header.keySet()) {

builder.header(key, header.get(key));

}

builder.url(request.getUrl()).get();

Request okRequest &#61; builder.build();

return execute(okRequest);

}

/**

* POST请求

*

* &#64;param request

* &#64;return

*/

&#64;Override

public IResponse post(IRequest request) {

request.setMethod(IRequest.POST);

MediaType mediaType &#61; MediaType.parse("application/json; charset&#61;utf-8");

RequestBody requestBody &#61; RequestBody.create(mediaType, request.getBody().toString());

Map header &#61; request.getHeader();

Request.Builder builder &#61; new Request.Builder();

for (String key : header.keySet()) {

builder.header(key, header.get(key));

}

builder.url(request.getUrl())

.post(requestBody);

Request okRequest &#61; builder.build();

return execute(okRequest);

}

/**

* PUT请求

*

* &#64;param request

* &#64;return

*/

&#64;Override

public IResponse put(IRequest request) {

request.setMethod(IRequest.PUT);

MediaType mediaType &#61; MediaType.parse("application/json; charset&#61;utf-8");

RequestBody requestBody &#61; RequestBody.create(mediaType, request.getBody().toString());

Map header &#61; request.getHeader();

Request.Builder builder &#61; new Request.Builder();

for (String key : header.keySet()) {

builder.header(key, header.get(key));

}

builder.url(request.getUrl())

.put(requestBody);

Request okRequest &#61; builder.build();

return execute(okRequest);

}

/**

* GET请求

*

* &#64;param request

* &#64;return

*/

&#64;Override

public IResponse delete(IRequest request) {

request.setMethod(IRequest.DELETE);

Map header &#61; request.getHeader();

Request.Builder builder &#61; new Request.Builder();

for (String key : header.keySet()) {

builder.header(key, header.get(key));

}

builder.url(request.getUrl())

.delete(null);

Request okRequest &#61; builder.build();

return execute(okRequest);

}

/**

* 文件上传

*

* &#64;param request

* &#64;param map

* &#64;param file

* &#64;return

*/

&#64;Override

public IResponse upload_image_post(IRequest request, Map map, File file) {

/**

* 实现文件上传

*/

request.setMethod(IRequest.POST);

MediaType MEDIA_TYPE_IMAGE &#61; MediaType.parse("image/*");

MultipartBody.Builder requestBody &#61; new MultipartBody

.Builder().setType(MultipartBody.FORM);

if (file !&#61; null) {

requestBody.addFormDataPart("image", file.getName(),

RequestBody.create(MEDIA_TYPE_IMAGE, file));

}

if (map !&#61; null) {

// map 里面是请求中所需要的 key 和 value

for (Map.Entry entry : map.entrySet()) {

requestBody.addFormDataPart(valueOf(entry.getKey()), valueOf(entry.getValue()));

}

}

Map header &#61; request.getHeader();

Request.Builder builder &#61; new Request.Builder();

for (String key : header.keySet()) {

builder.header(key, header.get(key));

}

builder.url(request.getUrl())

.post(requestBody.build());

Request okRequest &#61; builder.build();

return execute(okRequest);

}

/**

* 公共Execute方法

*

* &#64;param request

* &#64;return

*/

private IResponse execute(Request request) {

ResponseImpl commonResponse &#61; new ResponseImpl();

try {

Response response &#61; mOkHttpClient.newCall(request).execute();

commonResponse.setCode(response.code());

String body &#61; response.body().string();

commonResponse.setData(body);

} catch (IOException e) {

e.printStackTrace();

commonResponse.setCode(ResponseImpl.STATE_UNKNOW_ERROR);

commonResponse.setData(e.getMessage());

}

return commonResponse;

}

到这里封装就基本完成了&#xff0c;没有其他另类的东西&#xff0c;功能都是很基础的请求

下面有一个简单的使用示例

使用示例

IRequest request &#61; new RequestImpl(这里传入url);

//设置请求头&#xff0c;这里要几个就setHeader几次

request.setHeader(key,value);

// 设置请求体 同上

request.setBody(key,value);

// 获取一个okhttpclient实例

IHttpClient mHttpClient &#61; new OkHttpClientImpl();

// 得到服务器端返回的结果

IResponse response &#61; mHttpClient.get(request);

注&#xff1a;图片的功能好像不能正常实现&#xff0c;也可能是我app出现问题&#xff0c;下次使用时会着重注意



推荐阅读
author-avatar
八戒走你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有