Простая ошибка в командной строке Linux - PullRequest
2 голосов
/ 25 января 2012

у нас есть простой запрос REST, который я могу использовать вручную на моем Mac с RESTClient (из wiztools).URL-адрес http://ws -argos.clsamerica.com / argosDws / services / DixService? GetXml , а тело ниже:

<soap:Envelope 
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:typ="http://service.dataxmldistribution.argos.cls.fr/types">
  <soap:Body>
  <typ:xmlRequest>
     <typ:username>******</typ:username>
     <typ:password>******</typ:password>
     <typ:platformId>62518,62688,62520,62602,62608</typ:platformId>
     <typ:nbDaysFromNow>10</typ:nbDaysFromNow>
  </typ:xmlRequest>
 </soap:Body>
</soap:Envelope>

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

curl -H "content-type: application/soap+xml" \
 -H "SOAPAction:" \
 -d@soap.xml \
 -X POST http://ws-argos.clsamerica.com/argosDws/services/DixService?getXml \
> output.xml

, который вызывает soap.xml с:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:typ="http://service.dataxmldistribution.argos.cls.fr/types">
<soap:Body>
  <typ:xmlRequest>
     <typ:username>******</typ:username>
     <typ:password>******</typ:password>
     <typ:platformId>62518,62688,62520,62602,62608</typ:platformId>
     <typ:nbDaysFromNow>10</typ:nbDaysFromNow>
  </typ:xmlRequest>
</soap:Body>

Вывод:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
 <soap:Body><soap:Fault>    
 <soap:Code><soap:Value>soap:Sender</soap:Value></soap:Code>
 <soap:Reason><soap:Text xml:lang="en">Error reading XMLStreamReader.</soap:Text>
 </soap:Reason>
 </soap:Fault></soap:Body></soap:Envelope>

Кто-нибудь знает, как решить эту проблему или лучший способ ее автоматизации?Я новичок в CURL, но могу создать что-то на Java, если кто-нибудь предложит это как возможность (с примерами; -))

1 Ответ

0 голосов
/ 04 июля 2012

Я не использовал Curl, но, поскольку автор вопроса был бы доволен кодом Java, см. Ниже. Я следовал этому примеру: Как создать клиент SOAP на Google App Engine

Вот скрипт, который вы можете использовать для генерации кода для веб-службы Argos:

wsdluri='https://ws-argos.cls.fr/argosDws/services/DixService?wsdl'
gensrcdir='./src'
targetpackage='com.mypackage'
genoutdir='./war/WEB-INF/classes'
wsimport -extension -d "$genoutdir" -s "$gensrcdir" -p $targetpackage -keep "$wsdluri"

Вот простой тест для сгенерированного кода:

@Test
public void test_parse() throws IOException, DixException_Exception {
    try {
    DixServicePortType argos =  new DixService().getDixServicePort();
    CsvRequestType params = new CsvRequestType();
    params.setShowHeader(true);
    params.setUsername("your_user_name");
    params.setPassword("your_password");
    params.setDisplaySensor(true);
    // params.setProgramNumber("your_program_number"); 
    params.setPlatformId("your_device_id"); 
    params.setNbDaysFromNow(2);
    StringResponseType csvres = argos.getCsv(params);
    assertNotNull(csvres);
    System.out.println(csvres.getReturn()); 

    StringResponseType xmlres = argos.getXml(params);
    assertNotNull(xmlres);
    System.out.println(xmlres.getReturn());

    } catch (SOAPFaultException e) {
        e.printStackTrace();
        fail(e.getMessage());
    }
}

Обратите внимание, хотя я указал веб-сервис на адрес https, похоже, что сгенерированный код все еще подключается через http. Я хотел бы попробовать https, но мне придется изменить его вручную.

Теперь я хотел бы использовать Jaxb для анализа XML-ответа. Я могу разобраться с выходом CSV, он достаточно прост, но так как это мыло, мы можем сделать все так же. Любое предложение приветствуется.

[Изменить] Мне удалось получить схему для данных XML и генерировать классы с помощью компилятора "xjc" для демаршаллинга через jaxb. Получить схему так же просто, как:

    StringResponseType xmlSchema = argos.getXsd(new XsdRequestType());
    assertNotNull(xmlSchema);
    System.out.println(xmlSchema.getReturn()); 
    // save schema to argos.xsd file

Затем вы можете вызвать "xjc" для генерации классов:

xjc -p com.mypackage argos.xsd

К сожалению, есть проблема, с которой я сталкивался раньше, в случае отсутствия аннотаций "XmlRootElement". Много ТАК вопросов на этот счет. Насколько я понимаю, нужно заставить jxc трактовать определенные имена как уникальные (см. Также в этой статье ). Поскольку я предпочел бы не изменять схему, я попытался настроить "jxc" через файл конфигурации внешних привязок. Это не сработало, но сработало для других людей. Итак, в конце я внес несколько небольших изменений в схему вручную, добавив аннотации XmlRootElement к сгенерированным классам:

<xs:annotation>
    <xs:appinfo>
      <jaxb:globalBindings>
          <xjc:simple />
      </jaxb:globalBindings>
    </xs:appinfo>
</xs:annotation>

<xs:element name="data" type="data"/>

Теперь я могу анализировать данные XML с помощью Jaxb. Вот пример с разъемом jaxb Рестлета:

ConverterHelper decoder = new JaxbConverter();
Data data = decoder.toObject(new StringRepresentation( xmlres.getReturn()), Data.class, null);

Надеюсь, это поможет, если у вас есть проблемы с этим решением, пожалуйста, прокомментируйте.

...