POST XML-данные с помощью Groovy HTTPBuilder
Я пытаюсь поместить данные XML в URL-адрес с помощью класса HTTPBuilder. На данный момент у меня есть:
def http = new HTTPBuilder('http://m4m:aghae7eihuph@m4m.fetchapp.com/api/orders/create')
http.request(POST, XML) {
body = {
element1 {
subelement 'value'
subsubelement {
key 'value2'
}
}
}
response.success = { /* handle success*/ }
response.failure = { resp, xml -> /* handle failure */ }
}
и после проверки я вижу, что запрос действительно делается с XML в качестве тела. У меня есть 3 проблемы с этим, хотя. Во-первых, он пропускает классическую строку XML:
<?xml version="1.0" encoding="UTF-8"?>
который должен идти вверху тела, а во-вторых, также тип контента не установлен на:
application/xml
И, наконец, для некоторых элементов в XML мне нужно установить атрибуты, например:
<element1 type="something">...</element1>
но я понятия не имею, как это сделать в формате выше. У кого-нибудь есть идеи как? Или, может быть, альтернативный способ?
1 ответ
Решение
- Чтобы добавить строку объявления XML, вставьте
mkp.xmlDeclaration()
в начале вашей разметки. - Переходя
ContentType.XML
в качестве второго параметра для запроса устанавливаетContent-Type
заголовок кapplication/xml
, Я не могу понять, почему это не работает для вас, но вы можете попробовать использовать строкуapplication/xml
вместо. - Чтобы установить атрибуты для элемента, используйте этот синтаксис в построителе разметки:
element1(type: 'something') { ... }
Вот пример:
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.2')
import groovyx.net.http.*
new HTTPBuilder('http://localhost:8080/').request(Method.POST, ContentType.XML) {
body = {
mkp.xmlDeclaration()
element(attr: 'value') {
foo {
bar()
}
}
}
}
Результирующий HTTP-запрос выглядит так:
POST / HTTP/1.1
Accept: application/xml, text/xml, application/xhtml+xml, application/atom+xml
Content-Length: 71
Content-Type: application/xml
Host: localhost:8080
Connection: Keep-Alive
Accept-Encoding: gzip,deflate
<?xml version='1.0'?>
<element attr='value'><foo><bar/></foo></element>