HTTP发件人和REST约定

时间:2018-05-24 17:34:49

标签: mirth

我正在编写C#Web API服务器应用程序,并将通过Mirth HTTP Sender目标向其发送JSON。这篇文章是关于如何处理错误条件。具体来说,我想要处理三种情况:

  1. 有时我们会让C#应用程序服务器脱机一小段时间进行系统升级或维护,而Mirth根本无法连接。我希望Mirth按顺序对所有邮件进行排队,当服务器可用时,按照收到的顺序处理它们。
  2. 服务器接收请求,但由于请求内容的问题(例如,缺少必填字段)而拒绝该请求。根据REST约定,服务器将返回400级HTTP响应。此消息每次提交时都会被拒绝,因此不应重新发送;只记录失败并转到下一条消息。
  3. 服务器收到请求,但服务器上出现问题,服务器返回HTTP 500服务器错误响应。这将是适当的响应,例如,当服务器环境中的某些内容出错时。一个真实的例子是Web API服务器运行的时间,但有人重启了数据库服务器。 REST约定建议我们继续重新发送消息,直到瞬态问题得到解决。
  4. 对于#1,最初我让它排队失败/总是,但似乎响应转换器从不运行排队的消息(至少,调试语句从未显示在日志中)。我已经关闭排队,并将其设置为每十秒重试一小时,这似乎给出了所需的行为。我在这里走在正确的轨道上,还是错过了什么?

    对于#2和#3,返回任何HTTP 400或500错误会调用1小时的重试次数。我想要的是对500个错误应用1小时的重试,而不是400个错误。我在响应变换器中尝试了responseStatus = SENT,但响应转换器仅在小时到期后运行一次,而不是每次重试都运行一次。

    这似乎是一个常见的问题,但我找不到解决方案。你们其他人如何处理这个?

1 个答案:

答案 0 :(得分:1)

你关闭了!

因此,默认情况下,响应转换器只有在有转换的响应有效负载时才会运行。对于连接问题,或者可能对于不包含有效负载的4xx / 5xx响应,响应转换器不会执行。

,如果您设置了响应数据类型(从摘要 - >设置数据类型对话框,或从目标 - >编辑响应,消息模板选项卡)到Raw,那么响应变压器将一直执行。原因是Raw数据类型甚至认为空的有效负载是"可转换的"。

然后重新开始排队,并将响应数据类型设置为Raw。然后在响应转换器中,如果查看“参考”选项卡,则会出现HTTP发件人的类别:

HTTP Sender Functions

您需要"响应状态行"," HTTP / 1.1 200 OK"包含响应代码的响应行。这是一个响应转换器脚本,强制4xx响应错误:

if (responseStatus == QUEUED) {
    var statusLine = $('responseStatusLine');

    if (statusLine) {
        var parts = statusLine.split(' ');
        if (parts.length >= 2) {
            var responseCode = parseInt(parts[1], 10);

            // Force 4xx responses to error
            if (responseCode >= 400 && responseCode < 500) {
                responseStatus = ERROR;
                responseStatusMessage = statusLine;
            }
        }
    }
}