代码
cpp
BOOLEAN s_test_finish = FALSE; /**< 标记http流程结束 */
BOOLEAN s_retry = FALSE; /**< 用于判断是否需要重试 */
static void http_callback(ADP_HTTP_CALLBACK_EVENT_E event, INT8U *pack, INT32U pack_len, ADP_HTTP_TRANS_PROGRESS_T progress)
{
switch (event) {
case ADP_HTTP_CB_EVENT_ERROR:
APP_LOGD("ADP_HTTP_CB_EVENT_ERROR...");
s_retry = TRUE;
s_test_finish = TRUE;
break;
case ADP_HTTP_CB_EVENT_RSP_HEADER:
APP_LOGD("ADP_HTTP_CB_EVENT_RSP_HEADER...");
APP_LOGD("pack_len:[%d]",pack_len);
http_print(pack, strlen((char *)pack));
break;
case ADP_HTTP_CB_EVENT_RSP_CONTENT:
APP_LOGD("ADP_HTTP_CB_EVENT_RSP_CONTENT...");
APP_LOGD("pack_len:[%d]", pack_len);
http_print(pack, strlen((char *)pack));
APP_LOGD("progress: [%d / %d]", progress.dlen, progress.dtotal);
break;
case ADP_HTTP_CB_EVENT_RSP_END:
APP_LOGD("ADP_HTTP_CB_EVENT_RSP_END...");
APP_LOGD("pack_len:[%d]", pack_len);
http_print(pack, strlen((char *)pack));
APP_LOGD("progress: [%d / %d]", progress.dlen, progress.dtotal);
s_test_finish = TRUE;
break;
case ADP_HTTP_CB_EVENT_DOWNLOAD_PROGRESS:
APP_LOGD("HTTP_CB_EVENT_DOWNLOAD_PROGRESS...");
APP_LOGD("pack_len:[%d]", pack_len);
http_print(pack, strlen((char *)pack));
APP_LOGD("progress: [%d / %d]", progress.dlen, progress.dtotal);
break;
case ADP_HTTP_CB_EVENT_DOWNLOAD_END:
APP_LOGD("ADP_HTTP_CB_EVENT_DOWNLOAD_END...");
APP_LOGD("pack_len:[%d]", pack_len);
http_print(pack, strlen((char *)pack));
APP_LOGD("progress: [%d / %d]", progress.dlen, progress.dtotal);
s_test_finish = TRUE;
break;
default:
APP_LOGD("default...");
break;
}
}
/**
* @brief HTTPS GET测试函数
* @param [in] url
*/
INT32S https_test_get(const char *url)
{
INT32S ret;
ADP_HTTP_CLI_CONFIG_T cli_cfg = {
.request_type = ADP_HTTP_CLIENT_REQUEST_GET,
.url = (INT8U *)url,
.headers = NULL,
.headers_len = 0,
.down_file_path = NULL,
.post_file_path = NULL,
.postdata = NULL,
.postdata_len = 0,
.connect_timeout = 60,
.response_timeout = 60
};
ADP_HTTP_SSL_CONFIG_T ssl_cfg = {
.verify_level = ADP_HTTP_SSL_VERIFY_SERVER, /**< 单向认证 */
.ssl_contxtid = ADP_GPRS_PDP_COM_0, /**< 使用GPRS拨号的索引 */
.root_crt_path = (INT8U *)CLIENT_CA_YAXON_PATH, /**< 使用CA证书路径 */
.client_key_path = NULL,
.client_crt_path = NULL,
.root_crt = NULL, /**< 当前不支持内存传递秘钥 */
.client_crt = NULL,
.client_key = NULL
};
ADP_HTTP_CLIENT_T *http_handle;
ADP_HTTP_CALLBACK_T cb = {
.http_callback = http_callback,
};
http_title_printf("HTTPS GET Test Start.");
http_dump_ca_file(CLIENT_CA_YAXON_PATH);
http_handle = ADP_HTTP_Create();
APP_LOGD("http_handle:%p", http_handle);
ret = ADP_HTTP_SetCliCfg(http_handle, &cli_cfg);
if (ret != ADP_HTTP_SUCCESS) {
APP_LOGD("ADP_HTTP_SetCliCfg failed.");
return -1;
}
ret = ADP_HTTP_SetSSLCfg(http_handle, &ssl_cfg);
if (ret != ADP_HTTP_SUCCESS) {
APP_LOGD("ADP_HTTP_SetCliCfg failed.");
return -1;
}
ret = ADP_HTTP_Request(http_handle, cb);
if (ret != ADP_HTTP_SUCCESS) {
APP_LOGD("ADP_HTTP_SetCliCfg failed.");
return -1;
}
http_title_printf("HTTPS GET Test End.");
return 0;
}
问题
像这样的接口是阻塞的还是非阻塞的,比如ADP_HTTP_Request,怎么确认测试的每个http方法是否成功
回答
ADP_HTTP_Request 是非阻塞的:函数返回仅表示"请求已成功发起"。
是否真正成功,要看回调事件:
成功:收到 ADP_HTTP_CB_EVENT_RSP_END / ADP_HTTP_CB_EVENT_DOWNLOAD_END,并且 progress.resp_code 为 200(或业务期望码)。
失败:收到 ADP_HTTP_CB_EVENT_ERROR。
一旦收到 ADP_HTTP_CB_EVENT_ERROR,就会把 s_test_finish 置为 TRUE,等待循环立即退出,流程结束
当前用 s_test_finish/s_retry 的机制就是等回调判定成功/失败。