原生发交易示例

1、端口方式发请求

// 添加公共请求头 
CSIIHttpUtils.getInstance().addPublicHeader("key", "value");
// 需要上送的请求参数
Map<String,String> params = new HashMap<>();
params.put(key, value);
// 获取请求地址(以http://127.0.0.1开头的url)
// 入参path路径是类似相对路径"/xxx/xxx.png" 或者 "/xxx/xxx.do"
String url = Engine.getMappedUrl("path 路径");
// 此处以post请求为例,get请求不需要params
CSIIHttpUtils.getInstance().requestPostString(url, params, new HttpResultCallback() {
   @Override
   public void onResponse(Object response) {
    
   }

   @Override
   public void onException(int code, Throwable e) {

   }
});

2、接口方式发请求

2.1、接口

接口分为两种方式:
1、通过resourceApi接口,发送请求。
2、通过request对象发送请求。

ApiResponse Engine.resourceApi(String url,String method,String body,Map<String, String> header,Bool needRedirect);

参数:
url - 请求地址
method - 请求方法,传入"GET"或"POST"
body - 请求体
header - 请求头信息
needRedirect - 是否需要重定向

结果:
返回ApiResponse对象,从该对象中获取响应的信息

ServiceWorker Engine.getServiceWorker()

获取ServiceWorker对象,用于创建Request对象.

newRequest(String url,String method)
创建Request对象

参数:
url - 请求地址
method - 请求方法

结果:
返回ApiResponse对象.

Request

Request为MADP内的请求对象,调用该对象的相应方法实现请求的发送.

setHeader(String key,String value)
用于设置请求头,set方法会将value覆盖整个key字段

参数:
key - 请求头字段
value - 请求头的值

addHeader(String key,String value)
用于设置请求头,add方法在header原有基础上,添加value,不会对key的字段进行覆盖.

参数:
key - 请求头字段
value - 请求头的值

writeField(String key,String value)
填写表单,将value值,填写入key字段

参数:
key - 表头字段
value - 表单数据

writeFormFile(String key,String fileName,byte[] data)
将文件填写进入表单

参数:
key - 表头字段
fileName - 文件名称
data - 文件数据

send(byte[] data)
发送请求,若传入host地址为127.0.0.1则走madp内部的central配置,根据映射去进行报文加密,否则不对报文进行加密直接发送请求(在后管中配置的超时时间、ca绑定等依然有效);需要注意的是当调用writeFormFile或writeField方法时,发送表单数据,data不生效,传null即可,若不进行表单数据传输,可直接将body数据传入

参数:
data - 请求体数据

结果:
返回ApiResponse对象,从该对象中获取响应的信息.

ApiResponse

ApiResponse为MADP内的响应对象,调用该对象的相应方法获取对应的值.

String getCode()
获取状态码.

String getHeader()
获取响应头;响应头会以json串的形式返回.

String headerGet(String key)
获取响应中header的单个值.

byte[] getBody()
获取响应体.

String string()
将响应的body转为string返回.

Request对象、ServiceWorker对象从2021-06的交付版本开始支持。

2.2、参考代码

// 文件上传参考代码
String path1 = getFilesDir() + File.separator + "test1.jpg";
String path2 = getFilesDir() + File.separator + "test2.jpg";
ArrayList<String> pathList = new ArrayList<>();
pathList.add(path1);
pathList.add(path2);
ServiceWorker worker = Engine.getServiceWorker();
// 创建请求,newRequest(String url, String method) url-请求地址,method-请求方式
Request request = worker.newRequest("http://10.1.1.123:10000/upload", "POST");
for (int i = 0; i < pathList.size(); i++) {
     File file = new File(pathList.get(i));
     // 以表单形式上传文件,writeFormFile(String field,String fileName,byte[] data) field-表单key,fileName-文件名,data-文件字节数组; 如需提交表单可调用writeField(String key,String value) key-表单key,value-表单数据
     request.writeFormFile("file" + i, file.getName(), file2byte(file));
 }
   /**
     * 将文件转换成byte数组
     * @return
     */
    private byte[] file2byte(File tradeFile) {
        byte[] buffer = null;
        try {
            FileInputStream fis = new FileInputStream(tradeFile);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }

3、如何设置请求方式是走端口还是走接口?

以下是最完整的初始化的方式,其中有一个参数usePortService即代表请求方式,true代表使用端口方式发请求,false代表使用接口方式发请求。端口和接口最直接的区别是端口方式发请求会走代理,而接口方式发请求是直接向服务器请求数据,建议使用接口方式。

/**
         * @param app
         * @param isOpenLog      日志开关
         * @param openCockroach  bandage开关
         * @param usePortService 端口开关   true代表端口,false代表接口
         * @param launchModel    是否同步启动
         * @param httpProxy      代理
         * @param grayFlag       灰度
         * @param callback       回调
         */
        Engine.initEnvironment(this, true, true, false, MADConfig.LaunchModel.SYNC, "", 0, new Engine.InitEnvCallback() {
            @Override
            public void doInitFinish() {
                
            }
        });