Как сформировать запрос согласно grammars из WADL?

Есть сервис, с API. Схема работы с API описана WADL

<application xmlns="http://wadl.dev.java.net/2009/02" xmlns:tns="http://client.pub.api.cloudpbx.beeline.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://wadl.dev.java.net/2009/02 wadl.xsd">
    <grammars>
        <xs:schema xmlns:tns="http://client.pub.api.cloudpbx.beeline.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://client.pub.api.cloudpbx.beeline.ru">           
            <xs:element name="AbonentList">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="list" ref="tns:Abonent"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

            <xs:element name="ListCallRecordRequest">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="1" minOccurs="1" name="pageNumber" type="xs:long"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="pageSize" type="xs:long"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="userId" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="phone" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="direction" type="tns:Direction"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="dateFrom" type="xs:dateTime"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="dateTo" type="xs:dateTime"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="durationFrom" type="xs:long"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="durationTo" type="xs:long"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="sort">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element maxOccurs="1" minOccurs="1" name="direction" type="tns:SortDirection"/>
                                    <xs:element maxOccurs="1" minOccurs="1" name="field" type="tns:ListCallRecordRequestSortField"/>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

            <xs:element name="ListCallRecordResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="totalRecordQuantity" type="xs:long"/>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="list" ref="tns:CallRecord"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            
            <xs:element name="CallRecord">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="1" minOccurs="0" name="recordId" type="xs:long"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="abonent" ref="tns:Abonent"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="phone" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="callDirection" type="tns:Direction"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="date" type="xs:dateTime"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="duration" type="xs:long"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="fileSize" type="xs:long"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="comment" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="0" name="externalId" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            
            <xs:element name="AgentStatusResponce">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="1" minOccurs="1" name="status" type="tns:AgentStatus"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

            <xs:simpleType name="ListCallRecordRequestSortField">
                <xs:restriction base="xs:string">
                    <xs:enumeration value="Date"/>
                    <xs:enumeration value="Phone"/>
                    <xs:enumeration value="AbonentFio"/>
                    <xs:enumeration value="Comment"/>
                    <xs:enumeration value="Duration"/>
                    <xs:enumeration value="Direction"/>
                </xs:restriction>
            </xs:simpleType>

            <xs:simpleType name="Direction">
                <xs:restriction base="xs:string">
                    <xs:enumeration value="INB"/>
                    <xs:enumeration value="OUT"/>
                </xs:restriction>
            </xs:simpleType>

            <xs:simpleType name="SortDirection">
                <xs:restriction base="xs:string">
                    <xs:enumeration value="ASC"/>
                    <xs:enumeration value="DESC"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:schema>
    </grammars>

    <resources base="http://cloudpbx.beeline.ru/api/pub">
        <resource id="ClientPublicApiResource" path="/client">
            <resource path="/abonent">
                <method id="listAbonent" name="GET">
                    <response>
                        <representation element="tns:AbonentList" mediaType="application/xml"/>
                    </response>
                </method>
            </resource>
            <resource path="/abonent/{numberOrExtensionOrUserId}">
                <param name="numberOrExtensionOrUserId" style="template" type="xs:string"/>
                <method id="getAbonent" name="GET">
                    <response>
                        <representation element="tns:Abonent" mediaType="application/xml"/>
                    </response>
                </method>
            </resource>
            <resource path="/call/record">
                <resource path="/file/{recordIdOrExternalId}">
                    <param name="recordIdOrExternalId" style="template" type="xs:string"/>
                    <method id="getCallRecord" name="GET">
                        <response>
                            <representation mediaType="application/octeat-stream"/>
                        </response>
                    </method>
                </resource>
                <resource path="/list">
                    <method id="listCallRecord" name="PUT">
                        <request>
                            <representation element="tns:ListCallRecordRequest" mediaType="application/xml"/>
                        </request>
                        <response>
                            <representation element="tns:ListCallRecordResponse" mediaType="application/xml"/>
                        </response>
                    </method>
                </resource>
            </resource>
        </resource>
    </resources>
</application>


Согласно этому документу удалось сформировать запрос /client/abonent/ не требующий входных данных. Для запроса /client/call/record/list необходимы входные данные, в формате XML, формат описан в секции

<xs:element name="ListCallRecordRequest">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="1" minOccurs="1" name="pageNumber" type="xs:long"/>
            <xs:element maxOccurs="1" minOccurs="1" name="pageSize" type="xs:long"/>
            <xs:element maxOccurs="1" minOccurs="0" name="userId" type="xs:string"/>
            <xs:element maxOccurs="1" minOccurs="0" name="phone" type="xs:string"/>
            <xs:element maxOccurs="1" minOccurs="0" name="direction" type="tns:Direction"/>
            <xs:element maxOccurs="1" minOccurs="0" name="dateFrom" type="xs:dateTime"/>
            <xs:element maxOccurs="1" minOccurs="0" name="dateTo" type="xs:dateTime"/>
            <xs:element maxOccurs="1" minOccurs="0" name="durationFrom" type="xs:long"/>
            <xs:element maxOccurs="1" minOccurs="0" name="durationTo" type="xs:long"/>
            <xs:element maxOccurs="1" minOccurs="1" name="sort">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="1" minOccurs="1" name="direction" type="tns:SortDirection"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="field" type="tns:ListCallRecordRequestSortField"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>


Как сформировать подобный запрос?
  • Вопрос задан
  • 591 просмотр
Решения вопроса 1
temoffey
@temoffey Автор вопроса
Выяснилось что в секции grammars находится либо тело либо ссылка на XSD Schema File. Для формирования XML из XSD (содержимого секции grammars) использовал сервис xmlgrid.net/genXml.html

UPD 26.01.2017 Ответ для classinfo

Я сформировал xml документ:

<?xml version="1.0" encoding="utf-8"?>
<tns:ListCallRecordRequest xmlns:tns="http://client.pub.api.cloudpbx.beeline.ru">
<pageNumber>0</pageNumber> 
<pageSize>200</pageSize>
<direction>INB</direction>
<dateFrom>2004-02-12T15:19:21+00:00</dateFrom>
<dateTo>2004-02-12T15:19:21+00:00</dateTo>
<sort>
<direction>ASC</direction>
<field>Date</field>
</sort>
</tns:ListCallRecordRequest>


где:

pageNumber - порядковый номер выборки
pageSize - количество элементов выборки
direction - направление (INB - входящие)
dateFrom, dateTo - диапазон выборки, даты в формате ISO 8601
sort - сортировка
sort - field - по какому полю сортировать
sort - direction - направление сортировки (ASC - по возрастанию)

и отправил запрос методом "PUT", с заголовком "Content-type: application/xml" его по адресу "/api/pub/client/call/record/list"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@classinfo
А дальше как действовать? Как конкретно подключиться к API?
Ответ написан
@coolerpro08
Добрый день, пытаюсь проделать все то же самое. Но отвечает ошибкой 415(Unsupported Media Type). Если Вас не затруднит, поможете разобраться? Скрин из фидлера приложил.c18b6176b72e43cab5162a791eafa8a1.png
Вопрос решился подстановкой в Content-type: не "/api/pub/client/call/record/list" а "xml"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы