2014-01-23 3 views
0

предварительной подачи мне нужна помощь, чтобы создать API Proxies, которые соединяют 2 услуги Zoho Creator и Ebay Trading APIПользовательские Json в XML конвертировать в

Zoho Creator есть возможность отправить по протоколу HTTPS POST с JSON, но конструктор в Zoho не поддерживает многослойную JSON (только простая пара), eBay торговли апи принимает только HTTPS XML

Я посылаю простой запрос JSON

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

мне нужно преобразовать это в запросе XML со значением XMLDATA в теле и изменение типа Content-Type: в заголовке, чтобы "Текст/XML"

Когда я отправлять запрос от Zoho создателя, я получить в apigee Content-Type: применение/х-WWW-форм-urlencoded Content-Length: 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 encoded.

Может кто-нибудь помочь мне, как заставить его работать.

На выходе мне нужно:

Content-type: text/xml

Содержание как:

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

ответ

0

хорошо я получить это работает. В 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 Политика

<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> 
2

Выглядит довольно прямо вперед, но дайте мне знать, если я что-нибудь не хватает.

1) ExtractVariables Политика

Если въездной полезная нагрузка выглядит следующим образом:

{“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) AssignMessage политики для создания новой полезной нагрузки POST

Теперь, когда вы переменную с именем 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> 

Обратите внимание, что вам нужно избежать < и> в XML полезной нагрузки (в противном случае Apigee пытается проанализировать его как конфигурацию XML) и обратите внимание, что переменная {xmldata} в curlybraces.

Вот ссылки на документацию по 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

1

Если положить XML внутри JSON вам нужно убедиться, что XML экранирован и обрабатывает его должным образом. В противном случае у вас будет недействительный JSON. Если возможно, попробуйте отправить запрос JSON с необходимыми данными и не вставлять XML. Тогда, как и предыдущий ответ предложил:

  1. Извлечение необходимой информации из полезной нагрузки запроса JSON с помощью ExtractVariables политики и <JSONPath> конфигурации.
  2. Создайте XML-запрос, используя политику AssignMessage.
0

Попробуйте DefiantJS (http://defiantjs.com), который имеет функции, которые могут вам помочь. Среди прочего, он позволяет вам искать структуру JSON с выражениями запроса XPath, преобразовывать 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]'); 
Смежные вопросы