【问题标题】:Transformation on POST with a url encoded JSON payload使用 url 编码的 JSON 有效负载对 POST 进行转换
【发布时间】:2014-08-16 16:10:54
【问题描述】:

好的,我不会马上解决这个问题,所以我们会看看我是否遗漏了明显的内容。

根据请求

curl "https://api.me.com/v1/visitors" --data  "visitor=%7B%0A++%22funnels%22%3A+%7B%7D%2C%0A++%22_partition%22%3A+96%2C%0A++%22metric_sets%22%3A+%7B%0A++++%2234%22%3A+%7B%0A++++++%22safari%22%3A+1%0A++++%7D%0A++%7D%2C%0A++%22flags%22%3A+%7B%0A++++%22Book+Pack+Purchaser%22%3A+false%2C%0A++++%22Boat+PP+Viewer%22%3A+true%2C%0A++++%22Boat+Purchaser%22%3A+false%2C%0A++++%22Mobile+Shopper%22%3A+true%2C%0A++++%22Visitor+Buy%22%3A+false%2C%0A++++%22Testing%22%3A+true%2C%0A++++%22Book+Pack+PP+Viewer%22%3A+false%2C%0A++++%22Women%27s+Dept+Visitors%22%3A+true%2C%0A++++%22Boat+Abandoner%22%3A+false%0A++%7D%2C%0A++%22replaces%22%3A+%5B%5D%2C%0A++%22shard_token%22%3A+21000096%0A%7D"

您会注意到传递的 --data 是一个已编码的 JSON 对象。

 {"not":"my design"}

你可以去这里编码:http://www.url-encode-decode.com/ 基本上它变成了:

{
 "funnels": {},
"_partition": 96,
"metric_sets": {
  "34": {
    "safari": 1
  }
},
"flags": {
  "Book Purchaser": false,
  "Boat PP Viewer": true,
  "Boat Purchaser": false,
  "Mobile Shopper": true,
  "Visitor Buy": false,
   "Testing": true,
  "Book Pack PP Viewer": false,
  "Women's Dept Visitors": true,
  "Boat Abandoner": false
 },
"replaces": [],
"shard_token": 21000096
}

我不知道如何在脚本中将值转换为 JSON 对象,因此我可以开始混合数据。我有一个...

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="Script-ProcessRequestVars">
    <DisplayName>Script-ProcessRequestVars</DisplayName>
        <FaultRules/>
       <Properties/>
    <ResourceURL>jsc://Script-ProcessRequestVars.js</ResourceURL>
</Javascript>

有...

var processRequestPayload = function(){
       context.setVariable("my.requestVerb",context.proxyRequest.method);
       context.setVariable("my.visitor",context.proxyRequest.body.asForm['visitor'][0]);

       var visitObj = JSON.parse(context.proxyRequest.body.asForm['visitor'][0]);
       var shard = visitObj.shard_token;

};

function init() {
  processRequestPayload();
}

init();

但我得到的只是一个……

 {
   "fault": {
   "faultstring": "Execution of Script-ProcessRequestVars failed on line 4 with error: 1",
   "detail": {
     "errorcode": "steps.javascript.ScriptExecutionFailedLineNumber"
      }
   }
 }

我错过了什么??

【问题讨论】:

    标签: javascript json api apigee


    【解决方案1】:

    Kris,尝试替换:

    context.setVariable("my.visitor", context.proxyRequest.body.asForm['visitor'][0]);
    

    context.setVariable("my.visitor", request.body.asForm['visitor'][0]);
    

    context.proxyRequest.body 似乎存在问题。如果通过上述解决方法解决了此问题,请打开工单并同时使用此解决方法。

    【讨论】:

      【解决方案2】:

      我不确定您为什么将 JSON 作为表单参数传递...我个人会将正文作为 Content-Type: application/json 发送,并在 ExtractVariables 策略中使用 JSON 路径来设置 Apigee 变量您要操作的 JSON:

      POST
      Content-type: application/json
      
      {
       "funnels": {},
      "_partition": 96,
      "metric_sets": {
        "34": {
          "safari": 1
        }
      },
      "flags": {
        "Book Purchaser": false,
        "Boat PP Viewer": true,
        "Boat Purchaser": false,
        "Mobile Shopper": true,
        "Visitor Buy": false,
         "Testing": true,
        "Book Pack PP Viewer": false,
        "Women's Dept Visitors": true,
        "Boat Abandoner": false
       },
      "replaces": [],
      "shard_token": 21000096
      }
      

      ExtractVariables 示例:

      <ExtractVariables async="false" continueOnError="false" enabled="true" name="Extract-Variables-1">
          <DisplayName>Extract Variables 1</DisplayName>
          <FaultRules/>
          <JSONPayload>
              <Variable name="name">
                  <JSONPath>$.flags.Book%20Purchaser</JSONPath>
              </Variable>
          </JSONPayload>
          <Source clearPayload="false">request</Source>
          <VariablePrefix>apigee</VariablePrefix>
      </ExtractVariables>
      

      顺便说一句——您可能还希望避免在 JSON 标签中放置空格——这不是真正的标准并且可能导致解析问题...

      提取变量 http://apigee.com/docs/api-services/content/extract-message-content-using-extractvariables

      【讨论】:

      • 在我看来,将 JSON 作为表单参数传递也是一个糟糕的设计:{"not":"my design"} 一些供应商认为这是个好主意。
      • 另外,json 标签中的空格也是一种臭名昭著的做法。你敢打赌,我会在我的新外观中改造所有这些杂乱无章的东西。
      猜你喜欢
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多