使用
获取内置IShark实例
移动网关核心方法都在IShark接口中,发送API请求前需要先获取IShark实例,方法如下:
IShark shark = TMFBase.getShark();
发起HTTP API请求
请求接口
WeakReference<SharkHandler> sendHttpEntity(SharkHttpEntity req, int flag, final ISendHttpEntityCallback callback, long timeoutMillis);
参数类型 | 参数 | 说明 |
---|---|---|
SharkHttpEntity | req | 请求包的结构,由调用者填写具体的内容然后传入 |
int | flag | (1)可设置回调在哪个线程 子线程回调:SharkCommonConst.CALLBACK_RUN_ON_THREAD UI线程回调:SharkCommonConst.CALLBACK_RUN_ON_UI (2)可设置请求发起的通道 默认值(优先TCP,TCP失败走HTTP):CHANNEL_DEFAULT HTTP通道:CHANNEL_ONLY_HTTP TCP通道:CHANNEL_ONLY_TCP |
ISendHttpEntityCallback | callback | 网络请求回调接口 |
long | timeoutMillis | 超时时间,单位毫秒,<=0使用默认超时时间10分钟。 |
该接口请求与响应实体都使用SharkHttpEntity为载体,封装了HTTP body/header/query/cookie等字段。移动网关后端收到客户端请求后,会将SharkHttpEntity中数据按照标准HTTP请求方式转发给业务服务。移动网关后端收到业务服务响应后,会再将响应数据填充到SharkHttpEntity中返回给客户端。
- SharkHttpEntity
参数类型 | 参数 | 说明 |
---|---|---|
byte [] | data | 请求的 body,需要 UTF-8,对应管理后台的 body 参数位置 |
SashimiHeader | params | 请求参数实体 |
- SashimiHeader
参数类型 | 参数 | 说明 |
---|---|---|
Map |
header | 请求 header 信息,对应管理后台 header 参数位置 |
Map |
cookies | 请求 cookie 信息 |
Map |
query | query 请求参数信息,对应管理后台 query 参数请求位置 |
String | apiName | API 唯一标示,请参见API标识 |
结构体中的 data、header、query 与管理后台 API 中参数对应关系如下:
SashimiHeader | 管理后台参数位置 |
---|---|
data | body |
header | header |
query | query |
data 字段数据格式
(1) 如果管理后台的 body 位置并未设置任何参数,那么 SharkHttpEntity 中的 data 可以是任意格式的数据,例如:一个纯文本数据“这是 data”或一个 json 字符串;客户端发送什么数据服务端就会接收到什么数据。
(2)如果客户端在管理后台的 body 位置设置了参数,如下:
那么客户端 data 的字符串格式应该是如下内容:xiaoKey=value&xiaoKey1=value(value为参数的值)。
- ISendHttpEntityCallback
sendHttpEntity回调,转发请求结果给上层业务
public void onFinish(int seqNo, int cmdId, SharkRetCode retCode, SharkHttpEntity resp, SharkExtra sharkExtra)
参数类型 | 参数 | 说明 |
---|---|---|
int | seqNo | 后台回包的seq,一般不需关心 |
int | cmdId | 回包的cmdId, 请参见API标识 |
SharkRetCode | retCode | 错误码 |
SharkHttpEntity | resp | http请求的返回数据 |
SharkExtra | sharkExtra | 扩展数据,不需要关心 |
请求示例
private void testShark() {
// 创建请求实体类
SharkHttpEntity req = new SharkHttpEntity();
// 根据实际情况设置data, 对应http请求post body (非必须)
String data = "this is post body!";
req.data = data.getBytes(StandardCharsets.UTF_8);
// 创建Http请求参数实体
req.params = new SashimiHeader();
// 根据实际情况设置apiName, 是控制台API标识 (必须)
req.params.apiName = "TMFTest";
// 根据实际情况设置请求header, 对应http请求header (非必须)
req.params.header = new HashMap<>();
req.params.header.put("h1", "h1Value");
// 根据实际情况设置请求query, 对应url query (非必须)
req.params.query = new HashMap<>();
req.params.query.put("q1", "q1Value");
// 根据实际情况设置请求cookie, 对应http请求cookie (非必须)
req.params.query = new HashMap<>();
req.params.query.put("c1", "c1Value");
// 获取Shark实例
IShark shark = TMFBase.getShark();
// 发送请求
shark.sendHttpEntity(req, SharkCommonConst.DEFAULT, (seqNo, cmdId, retCode, resp, sharkExtra) -> {
if (retCode.isAccessLayerOk()
&& retCode.errorCode == ESharkCode.ERR_NONE
&& resp != null) {
//成功,处理请求数据
Log.d("TMFDemo", "resp = "
+ (resp.data != null ? new String(resp.data, StandardCharsets.UTF_8) : "null"));
} else {
//失败, 根据错误码做相应处理
Log.d("TMFDemo", "retCode = " + retCode);
}
}, 100000);
}
上面示例代码访问了创建虚拟API辅助接入测试中创建的虚拟API TMFTest, 运行后得到如下结果证明接入成功。
注意:如果在管理后台的 API 配置中设置了参数(如下图),那么在 SharkHttpEntity 实体中 data、header、query 等对应项也需要设置对应参数,否则请求失败。
获取 GUID
GUID是TMF生成的app级别移动设备标识,集成测试如果能顺利完成,那么就可以通过Shark获取到 GUID。示例代码如下:
TMFBase.getShark().getGuidAsyn(new IGuidCallback() {
@Override
public void onCallback(int retCode, String guid) {
Log.i(TAG,"guid = " + guid + ", retCode = " + retCode);
}
});