【问题标题】:Custom Json to XML convert in PreFlowPreFlow 中的自定义 Json 到 XML 转换
【发布时间】:2014-02-14 09:34:45
【问题描述】:

我需要帮助来创建加入 2 个服务 Zoho Creator 和 ebay Trading API 的 api 代理

Zoho Creator 可以发送带有 json 的 https POST,但 Zoho 中的构造函数不支持多层 json(仅简单对),eBay 交易 api 仅接受 https XML

我发送简单的 json 请求

{“XMLDATA”:”<GeteBayOfficialTimeRequest xmlns="urn:ebay:apis:eBLBaseComponents">...}

我需要将其转换为 XML 请求,正文中的值为 XMLDATA 并将 Content-type: 的类型更改为“text/xml”

当我从 Zoho 创建者发布请求时,我在 apigee 中获取 内容类型:application/x-www-form-urlencoded 内容长度:234 内容: XMLDATA=%3CGeteBayOfficialTimeRequest+xmlns%3D%22urn%3Aebay%3Aapis%3AeBLBaseComponents%22%3E+%3CRequesterCredentials%3E+%3CeBayAuthToken%3EMyToken%3C%2FeBayAuthToken%3E+%3C%2FRequesterCredentials%3E+%3C%2FGeteBayOfficialTimeRequest%3E

XMLDATA 的值 - url 编码。

谁能帮助我如何让它工作。

退出时我需要:

Content-type: text/xml

内容喜欢:

<?xml version="1.0" encoding="utf-8"?><GeteBayOfficialTimeRequest xmlns="urn:ebay:apis:eBLBaseComponents"><RequesterCredentials><eBayAuthToken>

【问题讨论】:

    标签: apigee zoho


    【解决方案1】:

    看起来很简单,但如果我遗漏了什么,请告诉我。

    1) 提取变量政策

    如果您的入站负载如下所示:

    {“XMLDATA”:”<GeteBayOfficialTimeRequest xmlns="urn:ebay:apis:eBLBaseComponents">...}
    

    然后像这样进行 JSON 提取:

    <JSONPayload>
        <Variable name="xmldata">
            <JSONPath>$.XMLDATA</JSONPath>
        </Variable>
    </JSONPayload>
    

    这只有在你的请求的 Content-Type 是 application/json 时才有效(如果你想强制它,在它之前做一个 AssignMessage 策略,然后

    <Set>
      <Headers>
        <Header name="Content-type">application/json</Header>
      </Headers>
    </Set>
    

    2) 用于创建新 POST 有效负载的 AssignMessage 策略

    现在您有了一个名为 xmldata 的变量,您可以使用如下所示的 AssignMessage 策略创建新的请求消息:

      <Payload contentType="text/xml">
        &lt;?xml version="1.0" encoding="utf-8"?&gt;
        &lt;GeteBayOfficialTimeRequest xmlns="{xmldata}"&gt;
        &lt;RequesterCredentials&gt;
        &lt;eBayAuthToken&gt;
        </Payload>
      </Set>
    

    请注意,您必须对 Payload XML 中的 进行转义(否则 Apigee 会尝试将其解析为配置 XML)并注意花括号中的 {xmldata} 变量。

    如果您需要有关政策的更多详细信息,请访问 Apigee 文档的链接:

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

    分配消息 http://apigee.com/docs/api-services/content/extract-message-content-using-extractvariables

    【讨论】:

      【解决方案2】:

      如果将 XML 放入 JSON 中,您需要确保 XML 被转义并正确处理。否则,您将获得无效的 JSON。如果可能,请尝试使用您需要的数据提交 JSON 请求,并且不要嵌入 XML。然后正如之前的答案所建议的那样:

      1. 使用ExtractVariables 策略和&lt;JSONPath&gt;config 从JSON 请求负载中提取所需信息。
      2. 使用 AssignMessage 策略构建 XML 请求。

      【讨论】:

        【解决方案3】:

        试试 DefiantJS (http://defiantjs.com),它的功能可能对您有所帮助。其中,它使您能够使用 XPath 查询表达式搜索 JSON 结构,将 XML 转换为 JSON 结构。

        您可以在此处找到 DefiantJS 和 XPAth 示例:
        http://defiantjs.com/#xpath-evaluator

        以这个 jsfiddle 为例;
        http://jsfiddle.net/hbi99/Yc6cc/

        var data = {
            "coupons":{
                "item1":{
                    "id":"155",
                    "name":"First Item",
                    "value":-5199.6
                },
                "item2":{
                    "id":"255",
                    "name":"Second Item",
                    "value":-424.91
                }
            }
        },
        res = JSON.search( data, '//*[id]' );
        

        【讨论】:

          【解决方案4】:

          好吧,我明白了。 在 Zoho Creator 中

          headerMap = map();
          headerMap.put("X-EBAY-API-COMPATIBILITY-LEVEL", "855");
          headerMap.put("X-EBAY-API-DEV-NAME", "...");
          headerMap.put("X-EBAY-API-APP-NAME", "...");
          headerMap.put("X-EBAY-API-CERT-NAME", "...");
          headerMap.put("X-EBAY-API-SITEID", "3");
          headerMap.put("X-EBAY-API-CALL-NAME", "GetItem");
          token = “...”;
          reqMap = map();
          reqMap.put("token", token);
          reqMap.put("xmlns", "urn:ebay:apis:eBLBaseComponents");
          reqMap.put("body", "<ItemID>...itemid...</ItemID>");
          url = ".....apigeeurl......";
          resp = postUrl(url, reqMap, headerMap);
          

          1) 提取变量政策

          <ExtractVariables async="false" continueOnError="false" enabled="true" name="extractform">
          <DisplayName>ExtractVar</DisplayName>
          <FaultRules/>
          <Properties/>
          <Header name="X-EBAY-API-CALL-NAME">
              <Pattern ignoreCase="false">{CallName}</Pattern>
          </Header>
          <FormParam name="token">
              <Pattern>{token}</Pattern>
          </FormParam>
          <FormParam name="xmlns">
              <Pattern>{xmlns}</Pattern>
          </FormParam>
            <FormParam name="body">
              <Pattern>{body}</Pattern>
          </FormParam>
          <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
          <Source clearPayload="false">request</Source>
          </ExtractVariables>
          

          2)AssignMessage策略创建新的POST

          <AssignMessage async="false" continueOnError="false" enabled="true" name="getebayofficialtime">
          <DisplayName>FormXml</DisplayName>
          <FaultRules/>
          <Properties/>
          <Set>
              <Headers>
                  <Header name="Content-type">text/xml</Header>
              </Headers>
              <Payload>
          &lt;?xml version="1.0" encoding="utf-8"?&gt;
          &lt;{CallName}Request xmlns="{xmlns}"&gt;
          &lt;RequesterCredentials&gt;
          &lt;eBayAuthToken&gt;{token}&lt;/eBayAuthToken&gt;
          &lt;/RequesterCredentials&gt;
          {body}
          &lt;/{CallName}Request&gt;
          </Payload>
          </Set>
          <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
          <AssignTo createNew="false" transport="http" type="request"/>
          </AssignMessage>
          

          【讨论】:

            猜你喜欢
            • 2013-08-20
            • 1970-01-01
            • 2014-07-23
            • 2014-07-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-02
            • 2014-01-17
            相关资源
            最近更新 更多