鸿蒙HarmonyOS NEXT开发实战:HTTP发起网络数据请求NAPI封装(C/C++) ...

打印 上一主题 下一主题

主题 846|帖子 846|积分 2538

鸿蒙开发实战往期文章必看:

HarmonyOS NEXT应用开发性能实践总结
一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!
“非常详细的” 鸿蒙HarmonyOS Next应用开发学习门路!(从零基础入门到醒目)
 “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路径!

使用fetchsync发送同步网络请求 (C/C++)

场景介绍

发送一个同步HTTP请求,也可以设置请求头和请求体等参数,并返返来自服务器的HTTP响应。常用于获取资源,支持通过拦截器来处理请求和响应。
接口说明

具体API说明详见接口文档。
  接口名
  描述
  Rcp_Response *HMS_Rcp_FetchSync(Rcp_Session *session, Rcp_Request *request, uint32_t *errCode);
  发送一个HTTP请求,并直接返返来自服务器的HTTP响应。
  使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <stdio.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建Request对象。"https://www.example.com"请根据实际情况替换为想要请求的URL地址。(实际使用时请将该代码块放入main函数或者其他函数区域内)。
    1. const char *kHttpServerAddress = "http://www.example.com";
    2. Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    复制代码
  • 创建会话。(实际使用时请将该代码块放入main函数或者其他函数区域内)。
    1. uint32_t errCode = 0;
    2. Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    复制代码
  • 发起请求,并处理返回结果。(实际使用时请将该代码块放入main函数或者其他函数区域内)。
    1. Rcp_Response *response = HMS_Rcp_FetchSync(session, request, &errCode);
    2. if (response != NULL) {
    3.     printf("Response status: %d\n", response->statusCode);
    4. } else {
    5.     printf("Fetch failed: errCode: %u\n", errCode);
    6. }
    复制代码
  • 清理response响应和request请求。最后关闭session。(实际使用时请将该代码块放入main函数或者其他函数区域内)。
    1. // 清理request
    2. HMS_Rcp_DestroyRequest(request);
    3. // 处理response,并清理response
    4. if (response != NULL) {
    5.     response->destroyResponse(response);
    6. }
    7. // 关闭session
    8. errCode = HMS_Rcp_CloseSession(&session);
    9. // 处理errCode
    复制代码
使用fetch发起异步网络请求 (C/C++)

场景介绍

发送一个异步HTTP请求,也可以设置请求头和请求体等参数,并返返来自服务器的HTTP响应。常用于获取资源,支持通过拦截器来处理请求和响应。
接口说明

具体API说明详见接口文档。
  接口名
  描述
  uint32_t HMS_Rcp_Fetch(Rcp_Session *session, Rcp_Request *request, const Rcp_ResponseCallbackObject *responseCallback);
  发送一个HTTP请求,并返返来自服务器的HTTP响应。使用responseCallback异步回调。
  

  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <stdio.h>#include <unistd.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建Request对象。"https://www.example.com"请根据实际情况替换为想要请求的URL地址。(完整见步骤5)
    1. const char *kHttpServerAddress = "http://www.example.com";
    2. Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    复制代码
  • 创建会话。(完整见步骤5)
    1. uint32_t errCode = 0;
    2. Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    复制代码
  • 发起请求,并处理返回结果。最后关闭session。
    1. bool g_callback = false;
    2. // 异步请求的响应处理回调,请用户自定义
    3. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode)
    4. {
    5.     (void *)usrCtx;
    6.     if (response != NULL) {
    7.         printf("Response status: %d\n", response->statusCode);
    8.     } else {
    9.         printf("Fetch failed: errCode: %u\n", errCode);
    10.     }
    11.     // 注意清理响应
    12.     if (response != NULL) {
    13.         response->destroyResponse(response);
    14.     }
    15.     g_callback = true;
    16. }
    17. int main() {
    18.     const char *kHttpServerAddress = "http://www.example.com";
    19.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    20.     request->method = RCP_METHOD_GET;
    21.     uint32_t errCode = 0;
    22.     // 创建session
    23.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    24.     // 配置请求回调
    25.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    26.     // 发起请求
    27.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    28.     // 处理errCode
    29.     // 等待fetch结果
    30.     int timeout = 100;
    31.     while (timeout-- > 0 && !g_callback) {
    32.         usleep(1000);
    33.     }
    34.     // 在退出前取消可能还在执行的requests
    35.     errCode = HMS_Rcp_CancelSession(session);
    36.     // 清理request
    37.     HMS_Rcp_DestroyRequest(request);
    38.     // 关闭session
    39.     errCode = HMS_Rcp_CloseSession(&session);
    40.     // 处理errCode
    41.     return 0;
    42. }
    复制代码
使用get发送网络请求 (C/C++)

场景介绍

发送一个带有默认HTTP参数的HTTP GET请求,并返返来自服务器的HTTP响应。使用异步回调。常用于从服务器获取数据。
使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <stdio.h>#include <unistd.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建会话,会话发起get请求。“http://www.example.com”请根据实际情况替换为想要请求的URL地址。等候响应返回后,烧毁request并关闭session。
    1. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode)
    2. {
    3.     (void *)usrCtx;
    4.     if (response != NULL) {
    5.         printf("Response status: %d\n", response->statusCode);
    6.     } else {
    7.         printf("Fetch failed: errCode: %u\n", errCode);
    8.     }
    9.     // 注意清理响应
    10.     if (response != NULL) {
    11.         response->destroyResponse(response);
    12.     }
    13. }
    14. bool g_callback = false;
    15. int main() {
    16.     const char *kHttpServerAddress = "http://www.example.com";
    17.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    18.     request->method = RCP_METHOD_GET;
    19.     uint32_t errCode = 0;
    20.     // 创建session
    21.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    22.     // 配置请求回调
    23.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    24.     // 发起请求
    25.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    26.     // 处理errCode
    27.     // 等待fetch结果
    28.     int timeout = 100;
    29.     while (timeout-- > 0 && !g_callback) {
    30.         usleep(1000);
    31.     }
    32.     // 在退出前取消可能还在执行的requests
    33.     errCode = HMS_Rcp_CancelSession(session);
    34.     // 清理request
    35.     HMS_Rcp_DestroyRequest(request);
    36.     // 关闭session
    37.     errCode = HMS_Rcp_CloseSession(&session);
    38.     // 处理errCode
    39.     return 0;
    40. }
    复制代码
使用post发送网络请求 (C/C++)

场景介绍

发送一个带有默认HTTP参数的HTTP POST请求,并返返来自服务器的HTTP响应。使用异步回调。常用于向服务器提交数据。与GET请求差别,POST请求将参数包罗在请求主体中,实用于创建新资源、提交表单数据或执行某些操作。
使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <cstdlib>
    3. #include <cstring>
    4. #include <stdio.h>
    5. #include <unistd.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建会话,会话发起post请求。“http://www.example.com”请根据实际情况替换为想要请求的URL地址。等候响应返回后,烧毁request并关闭session。
    1. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode)
    2. {
    3.     (void *)usrCtx;
    4.     if (response != NULL) {
    5.         printf("Response status: %d\n", response->statusCode);
    6.     } else {
    7.         printf("Fetch failed: errCode: %u\n", errCode);
    8.     }
    9.     // 注意清理响应
    10.     if (response != NULL) {
    11.         response->destroyResponse(response);
    12.     }
    13. }
    14. bool g_callback = false;
    15. int main() {
    16.     const char *kHttpServerAddress = "http://www.example.com";
    17.     const char *content = "content";
    18.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    19.     // 设置request参数
    20.     request->method = RCP_METHOD_POST;
    21.     request->content = (Rcp_RequestContent *)calloc(1, sizeof(Rcp_RequestContent));
    22.     request->content->type = RCP_CONTENT_TYPE_STRING;
    23.     request->content->data.contentStr.buffer = content;
    24.     request->content->data.contentStr.length = strlen(content);
    25.     uint32_t errCode = 0;
    26.     // 创建session
    27.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    28.     // 配置请求回调
    29.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    30.     // 发起请求
    31.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    32.     // 处理errCode
    33.     // 等待fetch结果
    34.     int timeout = 100;
    35.     while (timeout-- > 0 && !g_callback) {
    36.         usleep(1000);
    37.     }
    38.     // 清理request
    39.     HMS_Rcp_DestroyRequest(request);
    40.     // 清理request->content
    41.     free(request->content);
    42.     // 关闭session
    43.     errCode = HMS_Rcp_CloseSession(&session);
    44.     // 处理errCode
    45.     return 0;
    46. }
    复制代码
使用put发送网络请求 (C/C++)

场景介绍

发送一个带有默认HTTP参数的HTTP PUT请求,并返返来自服务器的HTTP响应。使用异步回调。常用于向服务器更新资源。PUT请求将更新的数据发送到特定的URL,用于替换指定资源的全部内容。
使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <cstdlib>
    3. #include <cstring>
    4. #include <stdio.h>
    5. #include <unistd.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建会话,会话发起put请求。“http://www.example.com”请根据实际情况替换为想要请求的URL地址。等候响应返回后,烧毁request并关闭session。
    1. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode)
    2. {
    3.     (void *)usrCtx;
    4.     if (response != NULL) {
    5.         printf("Response status: %d\n", response->statusCode);
    6.     } else {
    7.         printf("Fetch failed: errCode: %u\n", errCode);
    8.     }
    9.     // 注意清理响应
    10.     if (response != NULL) {
    11.         response->destroyResponse(response);
    12.     }
    13. }
    14. bool g_callback = false;
    15. int main() {
    16.     const char *kHttpServerAddress = "http://www.example.com";
    17.     const char *content = "content";
    18.     // 创建request,并设置request的参数
    19.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    20.     request->method = RCP_METHOD_PUT;
    21.     request->content = (Rcp_RequestContent *)calloc(1, sizeof(Rcp_RequestContent));
    22.     request->content->type = RCP_CONTENT_TYPE_STRING;
    23.     request->content->data.contentStr.buffer = content;
    24.     request->content->data.contentStr.length = strlen(content);
    25.     uint32_t errCode = 0;
    26.     // 创建session
    27.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    28.     // 配置请求回调
    29.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    30.     // 发起fetch请求
    31.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    32.     // 等待结果
    33.     int timeout = 100;
    34.     while (timeout-- > 0 && !g_callback) {
    35.         usleep(1000);
    36.     }
    37.     // 在退出前取消可能还在执行的requests
    38.     errCode = HMS_Rcp_CancelSession(session);
    39.     // 清理request
    40.     HMS_Rcp_DestroyRequest(request);
    41.     // 关闭session
    42.     errCode = HMS_Rcp_CloseSession(&session);
    43.     // 处理errCode
    44.     // 清理request content
    45.     free(request->content);
    46.     return 0;
    47. }
    复制代码

使用head发送网络请求 (C/C++)

场景介绍

发送一个带有默认HTTP参数的HTTP HEAD请求,并返返来自服务器的HTTP响应。使用异步回调。雷同GET请求,但只返回相应头,不返回实体内容。可以获取资源的元信息,如文件巨细、修改日期等。
使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <stdio.h>#include <unistd.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建会话,会话发起head请求。“http://www.example.com”请根据实际情况替换为想要请求的URL地址。等候响应返回后,烧毁request并关闭session。
    1. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode)
    2. {
    3.     (void *)usrCtx;
    4.     if (response != NULL) {
    5.         printf("Response status: %d\n", response->statusCode);
    6.     } else {
    7.         printf("Fetch failed: errCode: %u\n", errCode);
    8.     }
    9.     // 注意清理响应
    10.     if (response != NULL) {
    11.         response->destroyResponse(response);
    12.     }
    13. }
    14. bool g_callback = false;
    15. int main() {
    16.     const char *kHttpServerAddress = "http://www.example.com/head";
    17.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    18.     request->method = RCP_METHOD_HEAD;
    19.     uint32_t errCode = 0;
    20.     // 创建session
    21.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    22.     // 配置请求回调
    23.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    24.     // 发起fetch请求
    25.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    26.     // 等待fetch结果
    27.     int timeout = 100;
    28.     while (timeout-- > 0 && !g_callback) {
    29.         usleep(1000);
    30.     }
    31.     // 在退出前取消可能还在执行的requests
    32.     errCode = HMS_Rcp_CancelSession(session);
    33.     // 清理request
    34.     HMS_Rcp_DestroyRequest(request);
    35.     // 关闭session
    36.     errCode = HMS_Rcp_CloseSession(&session);
    37.     // 处理errCode
    38. }
    复制代码
使用delete发送网络请求 (C/C++)

场景介绍

发送一个带有默认HTTP参数的HTTP DELETE请求,并返返来自服务器的HTTP响应。使用异步回调。用于从服务器删除资源。通过向指定URL发送DELETE请求,可以删除该URL上对应的资源。
使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <stdio.h>#include <unistd.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建会话,会话发起delete请求。“http://www.example.com”请根据实际情况替换为想要请求的URL地址。等候响应返回后,烧毁request并关闭session。
    1. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode)
    2. {
    3.     (void *)usrCtx;
    4.     if (response != NULL) {
    5.         printf("Response status: %d\n", response->statusCode);
    6.     } else {
    7.         printf("Fetch failed: errCode: %u\n", errCode);
    8.     }
    9.     if (response != NULL) {
    10.         response->destroyResponse(response);
    11.     }
    12. }
    13. bool g_callback = false;
    14. int main() {
    15.     const char *kHttpServerAddress = "http://www.example.com/delete";
    16.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    17.     request->method = RCP_METHOD_DELETE;
    18.     uint32_t errCode = 0;
    19.     // 创建session
    20.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    21.     // 配置请求回调
    22.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    23.     // 发起fetch请求
    24.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    25.     // 等待fetch结果
    26.     int timeout = 100;
    27.     while (timeout-- > 0 && !g_callback) {
    28.         usleep(1000);
    29.     }
    30.     // 在退出前取消可能还在执行的requests
    31.     errCode = HMS_Rcp_CancelSession(session);
    32.     // 清理request
    33.     HMS_Rcp_DestroyRequest(request);
    34.     // 关闭session
    35.     errCode = HMS_Rcp_CloseSession(&session);
    36.     // 处理errCode
    37.     return 0;
    38. }
    复制代码
使用cancel取消网络请求 (C/C++)

场景介绍

取消指定或正在举行的会话请求。
接口说明

具体API说明详见接口文档。
  接口名
  描述
  uint32_t HMS_Rcp_CancelRequest(Rcp_Session *session, const Rcp_Request *request);
  取消指定或所有正在举行的会话请求。返回为空。
  使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <stdio.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建会话,会话发起请求。“http://www.example.com”请根据实际情况替换为想要请求的URL地址。在使用fetch请求后,使用HMS_Rcp_CancelRequest取消网路请求。烧毁request并关闭session。
    1. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode)
    2. {
    3.     (void *)usrCtx;
    4.     if (response != NULL) {
    5.         printf("Response status: %d\n", response->statusCode);
    6.     } else {
    7.         printf("Fetch failed: errCode: %u\n", errCode);
    8.     }
    9.     if (response != NULL) {
    10.         response->destroyResponse(response);
    11.     }
    12. }
    13. bool g_callback = false;
    14. int main() {
    15.     const char *kHttpServerAddress = "http://www.example.com/delete";
    16.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    17.     request->method = RCP_METHOD_DELETE;
    18.     uint32_t errCode = 0;
    19.     // 创建session
    20.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    21.     // 配置请求回调
    22.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    23.     // 发起fetch请求
    24.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    25.     // 取消请求,处理errCode
    26.     errCode = HMS_Rcp_CancelRequest(session, request);
    27.     // 在退出前取消可能还在执行的requests
    28.     errCode = HMS_Rcp_CancelSession(session);
    29.     // 清理request
    30.     HMS_Rcp_DestroyRequest(request);
    31.     // 关闭session
    32.     errCode = HMS_Rcp_CloseSession(&session);
    33.     // 处理errCode
    34.     return 0;
    35. }
    复制代码

使用close关闭会话 (C/C++)

场景介绍

远场通信请求结束后,须要关闭会话。调用此方法以释放与此会话关联的资源。
接口说明

具体API说明详见接口文档。
  接口名
  描述
  uint32_t HMS_Rcp_CloseSession(Rcp_Session **session);
  关闭会话。
  使用示例


  • CPP侧导入模块。
    1. #include "RemoteCommunicationKit/rcp.h"
    2. #include <stdio.h>#include <unistd.h>
    复制代码
  • CMakeLists.txt中添加以下lib。(具体请见C API开发准备)。
    1. librcp_c.so
    复制代码
  • 创建会话,会话发起请求后关闭会话。“http://www.example.com”请根据实际情况替换为想要请求的URL地址。等候响应返回后,烧毁request并关闭session。
    1. void ResponseCallback(void *usrCtx, Rcp_Response *response, uint32_t errCode) {
    2.     (void *)usrCtx;
    3.     if (response != NULL) {
    4.         printf("Response status: %d\n", response->statusCode);
    5.     } else {
    6.         printf("Fetch failed: errCode: %u\n", errCode);
    7.     }
    8.     if (response != NULL) {
    9.         response->destroyResponse(response);
    10.     }
    11. }
    12. bool g_callback = false;
    13. int main() {
    14.     const char *kHttpServerAddress = "http://www.example.com";
    15.     Rcp_Request *request = HMS_Rcp_CreateRequest(kHttpServerAddress);
    16.     request->method = RCP_METHOD_GET;
    17.     uint32_t errCode = 0;
    18.     // 创建session
    19.     Rcp_Session *session = HMS_Rcp_CreateSession(NULL, &errCode);
    20.     // 配置请求回调
    21.     Rcp_ResponseCallbackObject responseCallback = {ResponseCallback, NULL};
    22.     // 发起fetch请求
    23.     errCode = HMS_Rcp_Fetch(session, request, &responseCallback);
    24.     // 等待fetch结果
    25.     int timeout = 100;
    26.     while (timeout-- > 0 && !g_callback) {
    27.         usleep(1000);
    28.     }
    29.     // 在退出前取消可能还在执行的requests
    30.     errCode = HMS_Rcp_CancelSession(session);
    31.     // 处理errCode
    32.     errCode = HMS_Rcp_CloseSession(&session);
    33.     // 处理errCode
    34.     HMS_Rcp_DestroyRequest(request);
    35.     return 0;
    36. }
    复制代码
最后

小编在之前的鸿蒙系统扫盲中,我明显感觉到一点,那就是许多人到场鸿蒙开发,但是又不知道从那里动手,有很多小同伴不知道学习哪些鸿蒙开发技能?不知道须要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)门路图、文档、视频、用来跟着学习黑白常有须要的。 
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员
→  鸿蒙全栈最新学习条记 希望这一份鸿蒙学习文档可以或许给大家带来资助 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表