Возврат объекта Dictionary с PHP и SOAP - PullRequest
0 голосов
/ 15 августа 2011

Я пишу SOAP API на PHP и застрял. Я пытаюсь вернуть объект Dictionary в следующем формате:

Key: #
Value:
    Id: #
    Title: some title
    Text: blah

Я просматривал файлы WSDL и XSD службы SOAP API другого сайта и выяснил, как записать в них объект Dictionary, теперь я застрял в части PHP. Мой словарь настроен в WSDL / XSD, чтобы иметь целое число в качестве ключа и объект Comment в качестве значения, поэтому он должен быть массивом пар int ключ / значение комментария ... но я просто не могу понять, как сделать это на PHP. Вот структура, которую я получил в моем файле XSD:

  <xs:complexType name="DictionaryResponse">
    <xs:annotation>
      <xs:appinfo>
        <IsDictionary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">true</IsDictionary>
      </xs:appinfo>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="DictionaryResult">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Key" type="xs:int" />
            <xs:element name="Value" nillable="true" type="tns:Comment" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>

Объект Comment содержит только несколько фрагментов информации, таких как идентификатор, идентификатор и имя автора, текст, дата и т. Д. Я хочу, чтобы ключ «Словарь» был идентификатором комментария, а значение - комментарием. сам объект.

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

1 Ответ

0 голосов
/ 15 августа 2011

Ну, так как у меня не было ничего лучше, я продолжал возиться с этим и понял это. У меня было большинство правильных элементов, только в неправильном порядке.

Мой WSDL остался прежним, мне не нужно было ничего там менять. В моем первом XSD я изменил свой выходной элемент на это:

<xs:element name="GetDictionaryResponse">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" name="GetDictionaryResult" nillable="true" type="q2:DictionaryResponse" xmlns:q2="http://reachchallenges.infectionist.com/api/" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

В основном я возвращаю объект DictionaryResponse с именем GetDictionaryResult из второго XSD, DictionaryResponse обернут в объект GetDictionaryResponse. Мой второй XSD был там, где я ошибался, SOAP сбивает с толку, но я получил следующие элементы:

<xs:complexType name="DictionaryResponse">
  <xs:sequence>
    <xs:element minOccurs="0" name="status" nillable="true" type="xs:string" />
    <xs:element minOccurs="0" name="Data" type="tns:ArrayOfKeyValueOfintComment" />
  </xs:sequence>
</xs:complexType>
<xs:element name="DictionaryResponse" nillable="true" type="tns:DictionaryResponse" />

<xs:complexType name="ArrayOfKeyValueOfintComment">
  <xs:annotation>
    <xs:appinfo>
      <IsDictionary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">true</IsDictionary>
    </xs:appinfo>
  </xs:annotation>
  <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="unbounded" name="ArrayOfKeyValueOfintComment">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="Key" type="xs:int" />
          <xs:element name="Value" nillable="true" type="tns:Comment" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfKeyValueOfintComment" nillable="true" type="tns:ArrayOfKeyValueOfintComment" />

Объект DictionaryResponse содержит строку с именем «status», которую я поместил туда только в качестве теста. Он также содержит неограниченные объекты ArrayOfKeyValueOfintComment, в которых происходит магия. Наконец, сам PHP:

class GetDictionaryResponse {
  var $GetDictionaryResult;

  function GetDictionaryResponse() {
    $this->GetDictionaryResult = new GetDictionaryResult();
    }
  }

class GetDictionaryResult {
  var $status;
  var $Data;

  function GetDictionaryResult() {
    $this->status = (string)"Ok";
    }

  function AddItem($k, $v) {
    $d = new ArrayOfKeyValueOfintComment($k, $v);
    $this->Data[] = $d;
    }
  }

class ArrayOfKeyValueOfintComment {
  var $Key, $Value;

  function ArrayOfKeyValueOfintComment($k, $v) {
    $this->Key = $k;
    $this->Value = $v;
    }
  }

function GetDictionary() {
  $ret = new GetDictionaryResponse();
  for($i = 0; $i < 3; $i++) {
    $c = new Comment(array([comment elements]));
    $ret->GetDictionaryResult->AddItem($i, $c);
    }

  return $ret;
  }

Надеюсь, это не выглядит слишком запутанным. По сути, возврат выглядит так:

GetDictionaryResponse->
  GetDictionaryResult->
    string status;
    Dictionary<int, Comment> Data;

Я могу использовать его в .Net и получить из него действительный словарь, например:

DictionaryResponse r = client.GetDictionary (); Комментарий c = r.Data [0];

Надеюсь, я помог некоторым будущим читателям!

...