Gatewayscript调用后端返回空响应 如何构造查询串获取代理详情
基于agent_id获取后端代理详情的查询串实现方案
原有代码问题梳理
- 变量名大小写不统一:声明的变量是
LegacyAgentNumber,拼接查询串时误用了小写开头的legacyAgentNumber,会触发未定义错误 - 错误返回的JSON结构没有赋值给变量,属于语法错误,且变量插值方式错误
- 响应赋值时变量名错误:定义的响应变量是
sresponse,写入消息体时误用了不存在的response变量 - 未对查询参数做URI编码,存在特殊字符导致请求失败的风险
正确查询串编写方案
情况1:后端直接通过路径参数agent_id匹配代理
不需要额外构造$filter查询串,直接将URI中的{agent_id}替换为实际的代理ID值即可,最终请求URI形式:https://dev.blah.com:port/enterprise/dev/agencies/agency/books/book/agents/实际agent_id值/contact-information?requestId=_123&channelId=OL&channelName=OL
情况2:后端为OData规范接口,需要通过LegacyAgentNumber过滤查询
先修正变量名问题,对参数做URI编码后构造查询串,代码示例:
// 变量名大小写统一,对过滤值做URI编码避免特殊字符异常 var LegacyAgentNumber = apim.getvariable('request.parameters.LegacyAgentNumber'); var queryString = '$filter=contains(LegacyAgentNumber,\'' + encodeURIComponent(LegacyAgentNumber) + '\')'; apim.setvariable('queryString', queryString);
拼接后完整请求URI形式:https://dev.blah.com:port/enterprise/dev/agencies/agency/books/book/agents/实际agent_id值/contact-information?$filter=contains(LegacyAgentNumber,%27你传入的LegacyAgentNumber值%27)&requestId=_123&channelId=OL&channelName=OL
完整修正后的Gatewayscript代码
// 引入依赖模块 var sm = require('service-metadata.js'); var hm = require('header-metadata.js'); var apim = require('./apim.custom.js'); // 读取请求参数 var LegacyAgentNumber = apim.getvariable('request.parameters.LegacyAgentNumber'); var requestId = apim.getvariable('request.parameters.requestId'); var channelId = apim.getvariable('request.parameters.channelId'); var channelName = apim.getvariable('request.parameters.channelName'); var sm_user = apim.getvariable('request.parameters.sm_user'); var agentId = apim.getvariable('request.parameters.agent_id'); // 读取路径参数agent_id // 构造合法查询串 var queryString = '$filter=contains(LegacyAgentNumber,\'' + encodeURIComponent(LegacyAgentNumber) + '\')'; // 写入上下文变量 apim.setvariable('queryString', queryString); apim.setvariable('requestId', requestId); apim.setvariable('channelId', channelId); apim.setvariable('channelName', channelName); apim.setvariable('sm_user', sm_user); var contentType = apim.getvariable('request.headers.content-type'); apim.setvariable(sm_user, contentType, 'set'); if (error) { // 修正错误返回结构,正确引用requestId var errorResp = { "errorId": requestId + "Err", "refidRequest": requestId, "httpCode": "400", "httpMessage": "Bad Request", "moreInformation": "Invalid Input Parameters" } apim.setvariable('message.body', errorResp); apim.setvariable('message.headers.content-type','application/json'); apim.setvariable('message.status.code', 400); } else { // 构造正常响应 var vid = apim.getvariable ('request.parameters.id'); var vapiversion = apim.getvariable('api.version'); var vapiname = apim.getvariable('api.name'); var sresponse= {"AgentMailingAddressKeepAliveResponse": {"responseHeader": { "id": vid +"_rs", "refidRequest": vid, "cmdType": "response", "cmdStatus": "Success", "message": "keepAlive response message "+vapiname+":"+vapiversion }}} apim.setvariable('message.body', sresponse); apim.setvariable('message.headers.content-type','application/json'); apim.setvariable('message.status.code',200); }
内容的提问来源于stack exchange,提问作者Pinky
相关产品推荐
相关产品推荐

