## 场景介绍

在远场通信框架中，开发者们利用 TransferConfiguration，可以对 HTTP请求期间的数据传输行为进行精细化管理和定制化调整。TransferConfiguration提供了自动重定向策略、超时时间设定等关键功能的配置选项。通过理解和灵活运用这些属性，开发者可以根据项目需求，实现数据传输策略的个性化定制，从而获得更高效、更可靠的数据传输体验。

## 约束与限制

定制数据传输能力支持Phone、2in1、Tablet、Wearable设备。并且从5.1.1(19)开始，新增支持TV设备。

## 使用示例

下面会介绍超时重试场景下TransferConfiguration如何去使用。

### 超时重试

1. 导入需要的模块。

   收起

   自动换行

   深色代码主题

   复制

   ```
   1. import { rcp } from '@kit.RemoteCommunicationKit';
   2. import { BusinessError } from '@kit.BasicServicesKit';
   ```
2. 定义会话配置，创建会话，以及定义日志函数。

   收起

   自动换行

   深色代码主题

   复制

   ```
   1. // 定义日志函数
   2. const logI = console.info
   3. const logE = console.error

   5. // 定义会话配置
   6. const sessionConfig: rcp.SessionConfiguration = {
   7. requestConfiguration: {
   8. transfer: {
   9. timeout: {
   10. connectMs: 3000,
   11. transferMs: 6000
   12. }
   13. }
   14. }
   15. };

   17. // 创建会话
   18. const session = rcp.createSession(sessionConfig);
   ```
3. 定义异步函数，利用递归实现重试，如果请求失败，会在指定的重试次数内进行重试，在最后一次重试时，会等待3秒后再发送请求（根据实际情况进行调整）。

   收起

   自动换行

   深色代码主题

   复制

   ```
   1. async function retryRequest(url: string, retryCount: number, attempt: number): Promise<rcp.Response | undefined> {
   2. return new Promise((resolve, reject) => {
   3. // 在最后一次重试时，等待一段时间后再发送请求
   4. const delay = attempt === retryCount - 1 ? 3000 : 0; // 如果是最后一次重试，延迟3秒，否则不延迟
   5. setTimeout(() => {
   6. session.get(url)
   7. .then(response => {
   8. if (response.statusCode === 200) {
   9. logI(`Request successful on attempt ${attempt}.`); // 记录请求成功信息
   10. resolve(response); // 请求成功，Promise resolve
   11. } else {
   12. logE(`Request failed on attempt ${attempt}, statusCode: ${response.statusCode}`); // 记录请求失败信息
   13. if (attempt < retryCount) { // 如果还未达到重试次数
   14. retryRequest(url, retryCount, attempt + 1); // 进行下一次重试
   15. } else { // 如果已经达到重试次数
   16. logE(`All retries failed.`); // 记录所有重试失败信息
   17. reject(new Error('All retries failed')); // 所有重试失败，Promise reject
   18. }
   19. }
   20. })
   21. .catch((err: BusinessError) => { // 请求的catch块，处理请求过程中抛出的错误
   22. logE(`Request error on attempt ${attempt}, error: ${JSON.stringify(err)}`); // 记录请求错误信息
   23. if (attempt < retryCount) { // 如果还未达到重试次数
   24. retryRequest(url, retryCount, attempt + 1); // 进行下一次重试
   25. } else { // 如果已经达到重试次数
   26. logE(`All retries failed.`); // 记录所有重试失败信息
   27. reject(new Error('All retries failed')); // 所有重试失败，Promise reject
   28. }
   29. });
   30. }, delay); // 延迟指定时间后再发送请求
   31. });
   32. }
   ```
4. 调用retryRequest方法，实现网络请求的重试逻辑。

   收起

   自动换行

   深色代码主题

   复制

   ```
   1. // 定义URL
   2. const URL = 'https://www.example.com'

   4. // 定义重试次数，值为3
   5. const retryCount = 3
   6. // 定义当前尝试次数，初始值为1
   7. const attempt = 1

   9. // 调用retryRequest函数进行网络请求，参数为URL、重试次数和当前尝试次数,将返回的结果存储在response变量中
   10. const response = retryRequest(URL, retryCount, attempt);
   11. // 使用then方法处理response的成功返回情况
   12. response.then((res) => {
   13. // 如果返回的状态码不是200，表示请求未成功
   14. if (res?.statusCode != 200) {
   15. // 打印日志，表示超时重试失败
   16. logI(`Timeout retry failed`);
   17. return;
   18. }
   19. // 打印日志，如果返回的状态码是200，表示请求成功
   20. logI(`Timeout retry succeeded, print result: ${res}`);
   21. }).catch((err: BusinessError) => {
   22. // 打印日志，表示响应出错，并打印错误信息
   23. logE(`Response error, the error message is: ${JSON.stringify(err)}`);
   24. })
   ```