文档首页 > > SDK参考> 使用SDK> 使用SDK(C)> 下载流式数据

下载流式数据

分享
更新时间: 2019/05/07 GMT+08:00

样例代码

上传可以设置base64的方式或protobuf方式传输。

  • 使用DISSetSerializedMode("base64");设为base64方式上传
  • 或使用DISSetSerializedMode("protobuf");设为protobuf方式上传,
  • 通过DISGetSerializedMode();可以获取到用户设置的传输方式。

下载流式数据的主体代码如下:“streamName”的配置值要与开通DIS通道中“通道名称”的值一致。

char *streamName = "myStream";
char *projectId = "d575b0b740e54221aeb9a165653b103d";
char *region = "southchina";
char *host = "XXX.XXX.XXX.XXX:XXX";
int ret = 0;
DISResponseInfo RspInfo = { 0 };
DISCursor  NestCursor = { 0 };
printf("===================%s Begin=======================\n", __FUNCTION__);
DISGetCursor tempCursor = { 0 };
tempCursor.streamName = streamName;
tempCursor.partitionId = "shardId-0000000002";
tempCursor.cursorType = DISCursorTypeAtSeqNumber;
tempCursor.startingSequenceNumber = "1";
ret = DisGetCursor(host, projectId, region, &tempCursor, &RspInfo);
if (ret != 0 || RspInfo.HttpResponseCode >= 300)
{
printf("GetCursor Error: %d, the http code id %d, Error Code :%s, message: %s\r\n", ret, RspInfo.HttpResponseCode, RspInfo.ErrorCode, RspInfo.ErrorDetail);
printf("===================%s End=======================\n", __FUNCTION__);
return;
}
printf("===================Got Cursor=======================\n");
RspInfo.HttpResponseCode = 0;
ret = GetRecords(host, projectId, region, tempCursor.streamName, tempCursor.cursorResult.partitionCursor, 0, &NestCursor, GetRecordCallBack, &RspInfo);
if (ret != 0 || RspInfo.HttpResponseCode >= 300)
{
printf("GetRecords Error: %d, the http code id %d, Error Code :%s, message: %s\r\n", ret, RspInfo.HttpResponseCode, RspInfo.ErrorCode, RspInfo.ErrorDetail);
printf("===================%s Begin=======================\n", __FUNCTION__);
return;
}

下载数据需要先获取游标数据,然后通过游标数据下载流式数据。如何获取游标数据,请参考获取数据游标

表1 游标数据参数说明

名称

是否必选

类型

说明

partitionCursor

Char *

数据游标。

取值范围:1~512个字符。

说明:

数据游标有效期为5分钟。

注意GetRecords方法中有一个回调函数GetRecordCallBack,用于处理响应。该函数用户可以自定义,这里给出一个例子仅供参考。

DISStatus GetRecordCallBack(char *streamName, const DISGetRecords *record)
{
if (NULL == streamName || NULL == record || NULL == record->seqNumber || NULL == record->partitionId)
{
printf("%s the input param invalid\r\n", __FUNCTION__);
return 0;
}

printf("the partition key is %s\r\n", record->partitionId);
printf("the seqNumber is %s\r\n", record->seqNumber);
//record->data.data表示该数据的起始地址,record->data.stringLen表示该数据占据的长度。
printf("the data is %d: %s\r\n", record->data.stringLen, record->data.data);
return 0;
}

该回调函数将得到响应参数如下表。

名称

参数类型

说明

streamName

char *

通道名称

record

DISGetRecords *

记录详情

表2 DISGetRecords参数说明

参数名

类型

说明

partition_key

String

用户上传数据时设置的partition_key。

说明:

上传数据时,如果传了partition_key参数,则下载数据时可返回此参数。如果上传数据时,未传partition_key参数,而是传入partition_id,则不返回partition_key。

seqNumber

Char *

序列号。序列号是每个记录的唯一标识符。序列号由DIS在数据生产者调用PutRecords操作以添加数据到DIS数据通道时DIS服务自动分配的。同一分区键的序列号通常会随时间变化增加。PutRecords请求之间的时间段越长,序列号越大。

timestamp

long long

记录写入DIS的时间戳。

timestampType

Char *

时间戳类型。

CreateTime:创建时间。

pucReserved

void *

空指针,用于拓展响应体

表3 DISString参数说明

名称

是否必选

类型

说明

stringLen

long

上传的数据的长度。

data

Char *

上传的数据。

运行结果

可以在控制台查看到类似如下信息:

the partition key is 1
the seqNumber is 0
the data is 10: aaaaaaaaaa
the partition key is 1
the seqNumber is 1
the data is 55: 6o96l4h0fG05Zm4sXUKEI1fyFHz68pYISa7AAdYsi373CHi2W5gl6S6
the partition key is 1
the seqNumber is 2
the data is 62: A72p5Cw04c6dy4M756Rmehm2DyKzx4Cas1OJSUliv52Q6x3lxxCi6z0Zs1b0la
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问