---
title: "在 Web 服务数据映射中处理 HTTP 错误"
date: "2019-06-19"
categories: 
  - "data-integration"
  - "tools"
tags: 
  - "data-mapping"
  - "flowforce-server"
  - "http-testing"
  - "mapforce"
  - "mapforce-server"
  - "web-services"
description: 了解如何使用 MapForce 处理 Web 服务数据映射中的 HTTP 错误，从而确保自动化项目中的数据集成稳定可靠，并提供完善的错误报告。
---
Status: #blog

Tags:  #data-mapping #flowforce-server #http-testing #mapforce #mapforce-server #web-services

Categories: [data-integration](/blog/zh/category/data-integration.md) | [development](/blog/zh/category/development.md)
# 在 Web 服务数据映射中处理 HTTP 错误

包含来自外部Web服务的的数据集成项目在获取远程数据时，可能容易受到HTTP错误的影响。当数据映射在自动化控制下运行时，尤其重要的是能够检测并报告错误，即使这些错误只发生得非常罕见。

MapForce 数据映射可以包含对 Web 服务的调用，并将结果直接输出到文件或数据库，或者将其与其他输入结合，进行进一步处理。 无论最终输出形式如何，如果在 REST Web 服务请求中遇到 HTTP Web 服务错误，都会使数据映射面临风险。

MapForce 包含处理 HTTP 错误的特性，而不是简单地中止映射的执行。开发人员可以配置 REST Web 服务的调用，以便根据返回的 HTTP 状态码来处理和报告异常。

我们来看一个例子。

![](/blog/images/cbcr_blog_2.jpg)

<!--more-->

MapForce 软件中预装的样本数据映射包括一个名为 AirportStatus.mfd 的实际 REST Web 服务映射。该映射调用由美国联邦航空管理局赞助的 Web 服务，该服务提供关于美国主要机场运营延误的信息。该映射的输入是一个由三个字母组成的机场代码，该代码会传递给 Web 服务，而结果则以 JSON 文件的形式返回。以下是该映射及其示例结果。

[![Web服务数据映射，但不提供处理HTTP错误的功能](/blog/images/airport-status-mapping.png)](airport-status-mapping.png)

[![示例映射生成的 JSON 文件输出](/blog/images/mapping-result.png)](mapping-result.png)

如果出现任何 HTTP 错误，映射执行将会失败。

MapForce的帮助文档包含了关于如何处理REST Web服务响应中条件性情况的说明。我们可以简单地将处理HTTP错误的代码片段复制到现有的映射中，但如果发生HTTP错误，我们将无法验证结果。我们无法强制FAA的Web服务在测试时生成HTTP错误！

我们可以使用位于 httpstat.us 的 Web 服务来生成各种 HTTP 状态码和描述，以便在单独的数据映射中进行测试。例如，在浏览器窗口中访问 URL [https://httpstat.us/200](https://httpstat.us/200) 会返回“200 OK”。访问 URL [https://httpstat.us/400](https://httpstat.us/400) 会返回“400 Bad Request”，以此类推，可以为所有定义的、最高到 524 的状态码进行测试。

我们可以在 MapForce 中通过以下步骤来实现对该服务的 REST 请求：只需打开一个新的映射文件，然后在工具栏中点击“插入 Web 服务”按钮即可

![将Web服务功能嵌入到数据映射中](/blog/images/insert-web-service-function.png)

这会打开“Web服务调用设置”对话框，我们可以在这里手动配置各项设置。为了方便测试不同的值，我们将使用一个参数来代替任何特定的状态码。

[![Web服务调用设置的配置](/blog/images/web-service-call-settings.png)](web-service-call-settings.png)

以下是用于提供代码参数的映射关系，其中包含一个常数值

[![具有输入参数的数据映射的 Web 服务](/blog/images/mapping-1.png)](mapping-1.png)

默认情况下，Web服务功能仅支持200-299范围内的正常HTTP响应值。我们可以通过右键单击“响应”中的“主体”元素，打开“响应结构”对话框，从而添加对其他状态码的支持，并扩展可接受的状态码范围

[![通过扩展支持的状态码范围来处理 HTTP 错误](/blog/images/response-structure.png)](response-structure.png)

我们可以将 REST 请求的结果映射到一个简单的文本文件，使用 `decode-mime-entity` 函数来实现。由于 Web 服务在响应头中没有提供字符集的值，因此我们将常量值 "utf-8" 连接到解码函数中。

[![处理 HTTP 错误，方法是将响应映射到一段保存为文本的消息](/blog/images/mapping-2.png)](mapping-2.png)

现在，我们可以使用地图转换窗口底部的“输出”按钮来执行地图转换，并查看结果

![首次映射消息的测试结果](/blog/images/result-1.png)

 我们可以在映射面板中修改输入常量，然后重新执行，以查看差异

![映射消息的第二次测试结果](/blog/images/result-2.png)

我们可以使用一个连接函数，将结果与其他信息结合起来，从而创建一个更易于理解的状态消息

[![更全面的消息结果的定义](/blog/images/elaborate-message.png)](elaborate-message.png)

![更易于理解的地图信息](/blog/images/result-3.png)

一旦我们对映射功能进行了各种可能 HTTP 状态码的测试，并且对结果感到满意，我们就可以通过复制粘贴操作，将 HTTP 错误处理功能添加到现有的 AirportStatus.mfd 映射中。首先，我们将在 AirportStatus 映射中创建一个新的响应体，用于处理超出正常范围的响应码。 我们可以右键单击 Web 服务响应部分中的“Body”项，以添加一个新的“Body”节点。

![使用独立的响应体来处理 HTTP 错误](/blog/images/add-body-node.png)

这会添加新的主体，并打开“响应结构”对话框，在这里我们将指定如何处理所有大于 299 的 HTTP 状态码

![通过指定状态码的范围来处理 HTTP 错误](/blog/images/response-structure-2.png)

现在，我们可以将错误处理定义中的映射组件从测试映射中复制，粘贴到“AirportStatus”映射中，并连接新的响应体

[![在 REST Web 服务数据映射中，如何处理 HTTP 错误](/blog/images/copy-error-handling.png)](copy-error-handling.png)

现在，该映射定义了多个输出。在MapForce中手动执行时，用户可以选择其中一个输出。当映射的目的是在[MapForce Server](https://www.altova.com/zh/mapforce-server)的自动化控制下或在定期安排的[FlowForce Server](https://www.altova.com/zh/flowforceserver)任务中执行时，处理HTTP错误的执行路径的含义就变得清晰。例如，一个自动化的数据映射可以每半小时报告50个不同机场的状态。

在自动化执行过程中，所有数据映射的输出路径都会被处理。为了确保每个输入只调用一次 Web 服务，一个中间组件会在数据映射到最终目标之前，捕获 Web 服务的返回结果。如果发生任何 HTTP 错误，系统会记录发生错误的日期、时间以及具体的 HTTP 状态码。

在RESTful Web服务的数据映射中，处理HTTP错误就像安全带或灭火器——虽然非常重要，但我们希望永远用不上！

如果您是第一次使用 MapForce，请观看这个[视频介绍](https://youtu.be/a83na6G9FjI)，以便了解基本功能。您也可以通过[免费的30天试用](https://www.altova.com/zh/mapforce/download)亲自体验 MapForce。
