Groovy - разобрать / преобразовать x- www-form-urlencoded во что-то вроде JSON - PullRequest
0 голосов
/ 26 мая 2020

это моя вторая попытка более точно объяснить, что я ищу; -)

Я установил в Mailchimp веб-перехватчик, который срабатывает каждый раз, когда появляется новый подписчик аудитории. Mailchimp отправляет HTTP-запрос POST в конечную точку REST Jira Sriptrunner.

Тип содержимого этого запроса: application/x-www-form-urlencoded.

В конечной точке Jira я хотел бы прочитать данные запроса. Как я могу это сделать?

Полезная нагрузка (необработанное тело), ​​которое я получаю, выглядит следующим образом:

type=unsubscribe&fired_at=2020-05-26+07%3A04%3A42&data%5Baction%5D=unsub&data%5Breason%5D=manual&data%5Bid%5D=34f28a4516&data%5Bemail%5D=examlple%40bla.com&data%5Bemail_type%5D=html&data%5Bip_opt%5D=xx.xxx.xxx.198&data%5Bweb_id%5D=118321378&data%5Bmerges%5D%5BEMAIL%5D=example%40bla.com&data%5Bmerges%5D%5BFNAME%5D=Horst&data%5Bmerges%5D%5BLNAME%5D=Schlemmer&data%5Bmerges%5D%5BCOMPANY%5D=First&data%5Bmerges%5D%5BADDRESS%5D%5Baddr1%5D=XXX

Теперь я хотел бы проанализировать данные необработанного тела в JSON или что-то подобное.

Результат может выглядеть так:

{
 "web_id": 123,
 "email": "example@bla.com",
 "company": "First",
 ...
 }

Тем временем я немного поискал и нашел что-то вроде модуля node.js "querystring". Было бы здорово, если бы было что-то похожее в Groovy или любом другом способе синтаксического анализа данных формата application/x-www-form-urlencoded в json.

С уважением и заранее спасибо

Bernhard

Ответы [ 3 ]

0 голосов
/ 27 мая 2020
def body = "type=unsubscribe&fired_at=2020-05-26+07%3A04%3A42&data%5Baction%5D=unsub&data%5Breason%5D=manual&data%5Bid%5D=34f28a4516&data%5Bemail%5D=examlple%40bla.com&data%5Bemail_type%5D=html&data%5Bip_opt%5D=xx.xxx.xxx.198&data%5Bweb_id%5D=118321378&data%5Bmerges%5D%5BEMAIL%5D=example%40bla.com&data%5Bmerges%5D%5BFNAME%5D=Horst&data%5Bmerges%5D%5BLNAME%5D=Schlemmer&data%5Bmerges%5D%5BCOMPANY%5D=First&data%5Bmerges%5D%5BADDRESS%5D%5Baddr1%5D=XXX"

def map = body.split('&').collectEntries{e->
    e.split('=').collect{ URLDecoder.decode(it, "UTF-8") }
}

assert map.'data[merges][EMAIL]'=='example@bla.com'
map.each{println it}

распечатки:

type=unsubscribe
fired_at=2020-05-26 07:04:42
data[action]=unsub
data[reason]=manual
data[id]=34f28a4516
data[email]=examlple@bla.com
data[email_type]=html
data[ip_opt]=xx.xxx.xxx.198
data[web_id]=118321378
data[merges][EMAIL]=example@bla.com
data[merges][FNAME]=Horst
data[merges][LNAME]=Schlemmer
data[merges][COMPANY]=First
data[merges][ADDRESS][addr1]=XXX
0 голосов
/ 07 июля 2020

Я наконец нашел решение. Надеюсь, вы понимаете, и, возможно, это поможет другим; -)

Начиная с ответа Даггетта, я сделал следующее:

// Split body and remove unnecessary characters
def map = body.split('&').collectEntries{e->
    e.split('=').collect{ URLDecoder.decode(it, "UTF-8") }
}
// Processing the map to readable stuff
def prettyMap = new JsonBuilder(map).toPrettyString()
// Convert the pretty map into a json object
def slurper = new JsonSlurper()
def jsonObject = slurper.parseText(prettyMap)

(Карта очень похожа на ответ Даггетта. prettyMap )

Затем извлекаю ключи:

// Finally extracting customer data
def type = jsonObject['type']

И получаю нужные мне данные. Например,

Type : subscribe
...
First Name : Heinz
...

Спасибо daggett!

0 голосов
/ 26 мая 2020

Простой инструмент groovy:

def a = '''
data[email_type]: html
data[web_id]: 123
fired_at: 2020-05-26 07:28:25
data[email]: example@bla.com
data[merges][COMPANY]: First
data[merges][FNAME]: Horst
data[ip_opt]: xx.xxx.xxx.xxx
data[merges][PHONE]: xxxxx
data[merges][ADDRESS][zip]: 33615
type: subscribe
data[list_id]: xxXXyyXX
data[merges][ADDRESS][addr1]: xxx.xxx'''

def res = [:]

a.eachLine{
  def parts = it.split( /\s*:\s*/, 2 )
  if( 2 != parts.size() ) return
  def ( k, v ) = parts
  def complexKey = ( k =~ /\[(\w+)\]/ ).findAll()
  if( complexKey ) complexKey = complexKey.last().last()
  res[ ( complexKey ?: k ).toLowerCase() ] = v
}

res

дает:

[email_type:html, web_id:123, fired_at:2020-05-26 07:28:25, 
email:example@bla.com, company:First, fname:Horst, ip_opt:xx.xxx.xxx.xxx, 
phone:xxxxx, zip:33615, type:subscribe, list_id:xxXXyyXX, addr1:xxx.xxx]
...