<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
问题
客户端应用收到 HTTP 状态代码 500 Internal Server Error
,
将错误代码 protocol.http.EmptyPath
作为对 API 调用的响应。
错误消息
客户端应用将获得以下响应代码:
HTTP/1.1 500 Internal Server Error
此外,您可能还会看到以下错误消息:
{ "fault":{ "faultstring":"Request path cannot be empty", "detail":{ "errorcode":"protocol.http.EmptyPath" } } }
可能的原因
如果后端服务器的请求网址(由流变量表示)
<ph type="x-smartling-placeholder"></ph>
target.url
包含空路径。
根据规范 <ph type="x-smartling-placeholder"></ph> RFC 3986,第 3 部分:语法组件和 <ph type="x-smartling-placeholder"></ph> RFC 3986,第 3.3 节:路径:
URI 语法 包含以下组成部分:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
path
组件必需,且必须始终包含正斜杠 (/
),即使路径中不含其他字符也是如此。
因此,如果后端服务器的请求网址不包含 path
,
组件,也就是说,它甚至没有正斜线 (/
),则 Apigee
Edge 返回 500 Internal Server Error
和错误代码
protocol.http.EmptyPath
。
例如:如果 target.url
的值为
https://www.mocktarget.apigee.net
,那么当
path
组件为空或缺失。
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
后端服务器网址 (target.url) 的路径为空 | 流变量 target.url 表示的后端服务器网址的路径为空。 |
Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技术之一来诊断此错误:
API 监控
过程 1:使用 API 监控
<ph type="x-smartling-placeholder">如需使用 API Monitoring 诊断错误,请执行以下操作:
- <ph type="x-smartling-placeholder"></ph> 以拥有 相应角色。
切换到您要在其中调查问题的单位。
- 导航至分析 >API 监控 >调查页面。
- 选择您观察到错误的具体时间范围。
根据时间绘制错误代码。
<ph type="x-smartling-placeholder">选择一个错误代码为
protocol.http.EmptyPath
的单元格,如下所示:错误代码
protocol.http.EmptyPath
的相关信息显示为 如下所示:点击查看日志 ,展开失败请求对应的行。
- 在日志窗口中,请注意以下详细信息:
<ph type="x-smartling-placeholder">
- </ph>
- 状态代码:
500
- 故障来源:
target
- 错误代码:
protocol.http.EmptyPath
- 状态代码:
- 如果故障来源为
target
且错误代码为protocol.http.EmptyPath
,则表示后端服务器网址具有 空路径。
Trace
步骤 2:使用跟踪工具
<ph type="x-smartling-placeholder">如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话,并且
<ph type="x-smartling-placeholder">
- </ph>
- 等待发生
500 Internal Server Error
错误,或者 - 如果您可以重现问题,请进行 API 调用以重现问题
500 Internal Server Error
- 等待发生
确保已启用 Show all FlowInfos:
- 选择其中一个失败请求并检查跟踪记录。
- 浏览跟踪记录的不同阶段,并找到失败的位置。
您会在目标请求流程开始后的流程中发现该错误。 阶段,如下所示:
请记下跟踪记录中的错误值。
错误:请求路径不能为空
由于此错误是在目标请求流程开始阶段之后由 Apigee Edge 引发的, 则表示后端服务器网址中的
path
为空。这会 如果流变量target.url
(表示 后端服务器)可能已通过 请求流程。- 从 目标请求流已开始阶段的错误点。
确定更新流变量
target.url
的政策。显示 JavaScript 政策更新了流变量
target.url
的跟踪记录示例:在上面显示的示例跟踪记录中,记下流变量变量的值 在名为 SetTargetURL 的 JavaScript 政策中,将
target.url
更新为 如下:target.url : https://mocktarget.apigee.net
- 请注意,
target.url
具有以下组件: <ph type="x-smartling-placeholder">- </ph>
- 架构:
https://mocktarget.apigee.net
- path:空
- 架构:
- 因此,您会收到
Request path cannot be empty
错误。 - 进入跟踪记录中的 AX(记录的 Google Analytics 数据)阶段,然后点击该阶段。
向下滚动到 Stage Details - Error Headers 部分,并确定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
- 您将看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值显示为
protocol.http.EmptyPath
和target
,这表示 导致此错误的原因是后端服务器网址包含空路径。响应标头 值 X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
NGINX
过程 3:使用 NGINX 访问日志
<ph type="x-smartling-placeholder">如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是私有云用户,则可以使用 NGINX 访问日志来确定
有关 HTTP
500 Internal Server Error
的关键信息。 查看 NGINX 访问日志:
<ph type="x-smartling-placeholder">/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜索是否存在任何带有错误代码的
500
错误protocol.http.EmptyPath
(如果问题发生的时间: 过去),或者是否仍有任何请求仍失败并显示500
。 如果您确实在 X-Apigee-fault-code 匹配项中找到了任何
500
错误,protocol.http.EmptyPath
的值,然后确定 X-Apigee-fault-source.NGINX 访问日志中的 500 错误示例:
以上 NGINX 访问日志中的示例条目包含 X- Apigee-fault-code 和 X-Apigee-fault-source:
标头 值 X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
请注意,X-Apigee-fault-code 和 X-Apigee-fault-source 的值为
protocol.http.EmptyPath
和target
,这表示 导致此错误的原因是后端服务器网址包含空路径。
原因:后端服务器网址 (target.url) 的路径为空
诊断
- 使用 API 监控、跟踪工具或 NGINX 访问日志确定
500 Internal Server Error
的错误代码和错误来源,具体说明请参阅 常见的诊断步骤。 - 如果故障代码为
protocol.http.EmptyPath
,且故障来源 值target
,则表示后端服务器网址包含空 路径。 后端服务器网址由 Apigee 中的流变量
<ph type="x-smartling-placeholder">target.url
表示 Edge。如果您尝试更新后端服务器网址(即target.url
动态使用任何政策( 代理/共享流),以使其具有一个空路径。- 确定流变量
target.url
是否确实为空路径,以及 source,获取其值:Trace
使用跟踪工具
如果您已捕获此错误的跟踪记录,请按照 使用跟踪工具 ,并且:
- 验证
target.url
是否为空路径。 如果是,就看看哪项政策修改或更新了
target.url
以包含空路径。显示 JavaScript 政策更新了流程变量的示例跟踪记录
target.url:
- 在上面的跟踪示例中,请注意 JavaScript 政策已修改或
已将
target.url
的值更新为包含空路径。 - 请注意,
target.url
具有以下组件:- 架构:
https://mocktarget.apigee.net
- path:空
- 架构:
日志
在日志服务器中使用日志
- 如果您没有此错误的跟踪记录(间歇性问题),请检查
查看是否已记录有关用户流变量值的信息
target.url
,使用诸如 <ph type="x-smartling-placeholder"></ph> MessageLogging 或 ServiceCallout 并应用于您的日志服务器。 - 如果您有日志,请查看并执行以下操作:
<ph type="x-smartling-placeholder">
- </ph>
- 验证
target.url
是否为空路径,以及 - 看看您能否确定修改了哪些政策
target.url
包含空路径
- 验证
API 代理
查看失败的 API 代理
如果您没有此错误的跟踪记录或日志,请查看失败的 API 用于确定修改或更新流变量
target.url
的操作 包含无效路径。请检查以下各项:- API 代理中的政策
- 从代理调用的任何共享流
- 验证
检查特定策略(例如,AssignMessage 或 JavaScript)修改或 仔细更新流变量
target.url
并确定更新原因target.url
,因此路径为空。以下是一些示例政策,用于更新流变量
target.url
错误地包含导致此错误的空路径。示例 1
示例 1:更新
target.url
变量的 JavaScript 政策var url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
请注意,在上面的示例中,流变量
target.url
已更新。 值“https://mocktarget.apigee.net
”包含在另一个变量中url
。请注意,
target.url
具有以下组件:- 架构:
https://mocktarget.apigee.net
- path:空
由于路径为空,因此 Apigee Edge 会返回
500 Internal Server Error
以及 错误代码protocol.http.EmptyPath
。示例 2
示例 2:更新
target.url
变量的 JavaScript 政策var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
请注意,在上面的示例中,流变量
target.url
由 连接变量中包含的值https://mocktarget.apigee.net
url
以及 另一个变量path
的值,其 值是从request.header.Path.
检索到的如果您有权访问实际请求或跟踪记录,则可以验证实际值 传递给
request.header.Path
。用户提出的请求示例:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
在此示例中,标头路径不会作为请求的一部分发送。因此, 为
null
。因此:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + null
target.url = https://mocktarget.apigee.netnull
请注意,
target.url
具有以下组件:- 架构:
https://mocktarget.apigee.netnull
- path:空
示例 3
示例 3:AssignMessage 策略更新
target.url
变量 另一个变量<AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
请注意,
target.url
具有以下组件:- 架构:
https://mocktarget.apigee.net
- path:空
在上述所有示例中,后端服务器网址中的路径,即
target.url
为空,因此 Apigee Edge 返回500 Internal Server Error
,错误代码为protocol.http.EmptyPath
。- 架构:
解决方法
根据规范
<ph type="x-smartling-placeholder"></ph>
RFC 3986 第 2 部分:语法组件中所述,path
组件为
必需,并且必须始终带有正斜杠 (/),即使
path
中的其他字符。请执行以下步骤,
解决此问题:
- 确保后端服务器网址(由流变量表示)
target.url
始终具有非空路径。- 在某些情况下,路径中可能没有资源名称,那么请确保路径
且至少包含一个正斜杠 (
/
)。 - 如果您使用任何其他变量来确定数据流变量的值
target.url
,然后确保其他变量没有空路径。 - 如果执行任何字符串操作来确定流变量的值
target.url
,然后确保字符串的结果或结果 操作的路径不为空。
- 在某些情况下,路径中可能没有资源名称,那么请确保路径
且至少包含一个正斜杠 (
- 在诊断部分讨论的示例中,您可以按以下步骤解决此问题:
如下所述:
示例 1
示例 1:更新
target.url
变量的 JavaScript 政策向变量
url
添加正斜杠 (/
) 即可解决此问题 如下所示:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
示例 2
示例 2:更新
target.url
变量的 JavaScript 政策var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
请确保传递有效的路径,例如
/iloveapis
请求标头Path
来解决此问题,如下所示:示例请求:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
示例 3
示例 3:AssignMessage 策略通过
target.url
变量更新 另一个变量在 AssignMessage 政策的
<Value>
元素中添加有效路径。对于 例如,您可以使用/json
作为 MockTarget API。 也就是说,将<Value>
元素修改为https://mocktarget.apigee.net/json
,如下所示:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/json</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
规范
根据 Apigee Edge 的要求,后端服务器网址 没有空路径 以下规范:
规范 |
---|
<ph type="x-smartling-placeholder"></ph> RFC 3986,第 3 部分:语法组件 |
<ph type="x-smartling-placeholder"></ph> RFC 3986,第 3.3 节:路径 |
如果您仍需要 Apigee 支持团队的任何帮助,请前往 必须收集诊断信息。
必须收集诊断信息
按照上述说明操作后,如果问题依然存在,请收集以下内容 然后联系 Apigee Edge 支持团队。
如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成用于重现
500 Internal Server Error
的curl
命令(错误代码为protocol.http.EmptyPath
) - API 请求的跟踪文件
如果您是 Private Cloud 用户,请提供以下信息:
- 观察到失败请求的完整错误消息
- 环境名称
- API 代理软件包
- API 请求的跟踪文件
NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:ORG、ENV 和 PORT# 替换为 实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message- processor/logs/system.log