# HTTP Request步骤

> 把自动化资料发送到任何URL：method、request URL、query参数、header、body、变量、测试请求，以及失败时怎样显示。
>
> Source: https://docs.bcl.my/zh/automation-http-request/

**HTTP Request**步骤把自动化的资料发送到你选择的URL：CRM、邮件工具、BCL不支持的WhatsApp服务商，或你自己的系统。自动化运行时，BCL会从它的服务器发送，所以即使没有人打开BCL也能运作。

完整例子请看[Send orders to your CRM](/zh/automation-crm-webhook/)。

## 设置请求

用**Add Node** → **HTTP Request**添加这个步骤，然后双击它，打开**HTTP Request Action Settings**。

1. 在**Basic Configuration**下输入**Action Name**，例如“发送到CRM”。
2. 选择**Method**：**GET**、**POST**、**PUT**、**PATCH**或**DELETE**。大多数接收新记录的系统都要用**POST**。
3. 输入**Request URL**，最多500个字符。它可以包含变量，例如`https://api.example.com/orders/{order_number}`。
4. 按照你系统的文档，填写下面的三个标签页：**Query Parameters**、**Headers**和**Body**。
5. 点击**Send Test Request**，用示例资料试一试。
6. 点击**Save HTTP Request**。

   *(Screenshot: HTTP Request Action Settings，选择了POST，有Request URL，Body标签页里是含变量的JSON body)*

## 三个标签页

每个标签页都可以用两种方式填写。**Key-Value**给你一行行的名称和值。**Raw JSON**（在**Query Parameters**是**Raw Query**）让你自己输入全部内容。

| 标签页 | Key-Value的每一行会变成 | Raw格式 | 例子 |
| --- | --- | --- | --- |
| **Query Parameters** | 加在URL后面的`?name=value`配对 | 不带开头`?`的query string | `source=bcl&order={order_number}` |
| **Headers** | 每行一个HTTP header | 一个JSON object | `{"X-Api-Key": "your-api-key"}` |
| **Body** | 每行一个栏位，以JSON发送 | 一个JSON object | `{"email": "{email}", "amount": {amount_value}}` |

**GET**请求不会发送**Body**标签页。每个标签页的值都可以用变量。

每个标签页上方的按钮可以帮你填写：

| 按钮 | 作用 |
| --- | --- |
| **Variables** | 列出你触发器的变量。点击一个就会复制它。 |
| **Insert all** | 加入触发器的每个变量，并以变量本身命名，例如`"order_number": "{order_number}"`。先快速开始，再删减。 |
| **Format** | 在**Raw JSON**模式整理JSON，如果不是有效的JSON会告诉你。 |
| 垃圾桶图标 | 确认后清空这个标签页。 |

在**Key-Value**模式，每一行的代码图标会把变量插入该值，每一行也可以复制或移除。

## JSON body里的变量

BCL会先替换变量，然后才把body当作JSON读取。因此有两点要注意：

- 文字变量要加引号：`"name": "{name}"`。
- 数字和列表变量不加引号，这样它们会以数字和列表送到：`"amount": {amount_value}`和`"items": {items_json}`。编辑器的**Format**按钮会因为没有引号的`{...}`而说这是无效的JSON，但替换后它是有效的。

如果替换后body仍然不是有效的JSON，BCL会发送空的body。当顾客的答案里有双引号时，就可能发生这种情况。在依赖它之前，先用接近真实的资料测试。

## 测试请求

**Send Test Request**（在**Action Name**旁）会马上用示例值发送请求，例如“Ahmad Ali”和“LINK-12345”。绿色的**Test Request Successful**通知会显示状态码和回复的开头；红色的**Test Request Failed**通知会显示出了什么问题。测试最多等待30秒。

测试会把真实资料发送到URL，所以如果它会创建真实记录，请改用你系统的测试endpoint。

## 运行时会发生什么

自动化运行时，BCL最多等待10秒的回复，遇到连接问题会重试两次。状态码为2xx的回复就算成功。

在运行记录里，用**View**打开这次运行。步骤会显示**Completed**或**Failed**，**View Response**则显示URL、method、状态码和回复。失败的请求会显示状态码，例如`HTTP 401`，如果另一个系统有发送错误信息，后面会接着显示。超过50,000个字符的回复会被截短。

## 小贴士

几个好习惯，让请求安全又可靠：

- **API key放在Headers，不要放在URL里**。很多系统接受`Authorization`或`X-Api-Key` header；URL会显示在运行记录里。
- **数字用`{amount_value}`，不要用`{amount}`**。`{amount}`包含“RM”，另一个系统可能会拒绝。
- **每个目的地一个请求**。要发送到两个系统，就添加两个HTTP Request步骤。
- **订单用Payment Successful，不要用Payment Initiated**。Initiated在顾客付款之前就会触发，所以未付款的订单也会送到你的CRM。

## 常见问题

### 我可以把新的lead直接发送到我的CRM或邮件工具吗？

可以。用New Lead Received创建一个自动化，加上一个HTTP Request步骤。在Request URL放入该工具的API地址，在Headers放入它的API key，再在Body配对你的lead栏位，例如"email": "{email_address:2}"。

### 请求有送到，但名字和电邮是空的。为什么？

变量和你的栏位不符合。lead表单栏位需要栏位名称和id，例如{email_address:2}。不存在的变量会以空白发送，也不会显示错误。请从Variables列表复制key。

### 我怎样知道另一个系统有没有接受资料？

打开自动化的Overview，在一次运行上点击View。HTTP Request步骤会显示状态码，View Response下则显示另一个系统的回复。
