Я не использовал 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);
Надеюсь, это поможет, если у вас есть проблемы с этим решением, пожалуйста, прокомментируйте.