SOAP-реализация архитектуры UPnP

#xml #linux #curl #soap #upnp

#xml #linux #curl #soap #upnp

Вопрос:

Я пытаюсь реализовать контрольную точку UPnP AV. я завершил этап описания архитектуры. Чтобы получить содержимое сервера из действия просмотра, я использую команду CURL, как показано ниже.

curl -o response.xml -H «Хост: 192.168.1.47:2869» -H «Тип содержимого: текст / xml; Кодировка =»UTF-8″» -H «SOAPAction: «http://192.168.1.47:2869/upnphost/udhisapi.dll?content=uuid:67240e36-10e0-45f6-9c4b-e18cdd53360e «» -d @request.xml -X СООБЩЕНИЕ http://192.168.1.47:2869/upnphost/udhisapi.dll?control=uuid:99261858-3c45-41b5-87fd-3f30b4700005 urn:upnp-org:serviceId:ContentDirectory

URL-адрес в SOAPAction — это URL-адрес описания службы сервера. URL-адрес после POST является управляющим URL-адресом сервера.

Мой request.xml это как показано ниже:

    <?xml version = "1.0" encoding="utf-8"?>
   <s:Envelope
        xmlns:s = "http://schemas.xmlsoap.org/soap/envelope">
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">
        <s:Body>
           <u:Browse xmlns:u="urn:schemas-upnp-org:Service:ContentDirectory:1">
                   <ObjectID>"0"</ObjectID>
                   <BrowseFlag>"BrowseDirectChildren"</BrowseFlag>
                   <Filter>"*"</Filter>
                   <StartingIndex>0</StartingIndex>
                   <RequestedCount>3</RequestedCount>
                   <SortCriteria>""</SortCriteria>

           </u:Browse>
    </s:Body>
    </s:Envelope>
  

`

XML-ответ, который я получаю, не содержит необходимого мне основного содержимого. XML-ответ является:

     <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
       <s:Fault>
           <faultcode>s:Client</faultcode>
           <faultstring>UPnPError</faultstring>
           <detail>
              <UPnPError>
                  <errorCode>401</errorCode>
                   <errorDescription>Invalid Action</errorDescription>
              </UPnPError>
           </detail>
    </s:Fault>
    </s:Body>
    </s:Envelope>
  

Как мне получить содержимое сервера.

Ответ №1:

Soapaction должен быть полностью указанным идентификатором действия, которое вы хотите вызвать. Вместо этого вы отправляете URL-адрес в описание службы. Следующее должно работать лучше:

 SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
  

Ваш xml также может быть недействительным, угловые скобки, похоже, не совпадают. Я бы также проверил цитирование значений аргумента Browse: я считаю, что ни одно из них не должно заключаться в кавычки.

Комментарии:

1. я изменил soapaction. теперь моя ошибка — недопустимые аргументы.

2. Посмотрите на ‘<‘ и ‘>’, которые вы используете для вложения s:envelope , и их атрибуты. Кажется, есть дополнительный ‘>’.

3. Проверьте спецификацию ContentDirectory: я предполагаю BrowseFlag , что значение (в вашем случае BrowseDirectChildren) не должно заключаться в кавычки, потому что это не строка, а перечисление.

4. @jku BrowseFlag — это строка. Перечисление в этом случае представляет собой просто строку с allowedValueList, которая определяет набор допустимых строковых входных данных.

5. simonc верен. Я предполагаю, что причина, по которой мне это показалось неправильным, заключается в том, что ни одно из значений переменных не должно заключаться в кавычки.