1

I need to send request with groovy HTTPBuilder, here is code:

String authToken = "token" def cfManager = ComponentAccessor.getCustomFieldManager() def addressJira = "http://xxx" def http = new HTTPBuilder("${address}") http.setClient(HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build()) try { http.request(POST, ContentType.JSON) { headers.'Authorization' = "token ${authToken}" headers.'Content-Type' = 'application/json' headers.'cache-control' = 'no-cache' body = [ "request": [ "token":"${authToken}", "commonData":[ "taskId":"${issue.id.toString()}" ], "phonesData":[ "phone":"${cfManager.getCustomFieldObject("customfield_xxx")?.getValue(issue)?.toString()}", "phoneType": 1 ], "addData": [ "title":"${issue.summary.toString()}", "description":"${issue.description.toString()}" ] ] ] requestContentType = ContentType.JSON response.success = { resp, json -> log.info("Resp status " + resp.status.toString()) log.info("JSON ${json.toString()}") log.info("JSON text ${json.text}") } response.failure = { resp -> log.warn("response code is : " + resp.status.toString()) log.warn("response is : " + resp.getEntity().getContent().getText()) } } } catch (Exception e) { log.warn("Exceptiion while request" + e) } 

I get resp code 200 but on the other side they get JSON like this and can't parse it because of "valueCount", "strings" and "bytes":

{ "request": { "token": { "valueCount": 1, "strings": ["", ""], "bytes": [85, 69, 108, 112, 108, 120, 90, 99, 113, 107, 100, 106, 71, 108, 121, 102, 199, 115, 103, 107, 33, 45, 109, 70, 37, 65, 91, 33, 47, 77, 54, 83, 111, 115, 77, 49, 77, 50, 107, 74, 65, 122], "values": ["token"] }, "commonData": { "taskId": { "valueCount": 1, "strings": ["", ""], "bytes": [48, 49, 55, 56, 56], "values": ["here is issue id"] } }, "phonesData": { "phone": { "valueCount": 1, "strings": ["", ""], "bytes": [43, 53, 54, 55, 56, 57, 48], "values": ["+01234567890"] }, "phoneType": 1 }, "addData": { "title": { "valueCount": 1, "strings": ["", ""], "bytes": [84, 101, 115, 116], "values": ["Test"] }, "description": { "valueCount": 1, "strings": ["", ""], "bytes": [-113, -48, -78, -48, -70, -48, -80, 32, -48, -76, -48, -69, -47, -113, 32, -48, -102, -48, -90, 32, -48, -98, -48, -73, -48, -66, -48, -67, 46], "values": ["here is issue summary"] } } } } 

So the question is why they get that parameters and what I have to do not to send that "valueCount", "strings" and "bytes"? Thanks to any help

4
  • 2
    Have you tried with e.g. "${issue.summary}".toString() instead? Commented Jan 29, 2021 at 6:18
  • What @cfrick said + you might want to try that on all the GString values in the json structure. Once you write "${something}", the resulting object will be of class GString which seems to mess up the json serialization. Commented Jan 29, 2021 at 9:35
  • That's what i meant: the toString() forces a string (and toString inside the var of a Gstring is useless anyway). Commented Jan 29, 2021 at 9:39
  • do NOT use string interpolation here. Instead of "taskId":"${issue.id.toString()}" use "taskId":issue.id Commented Jan 29, 2021 at 10:14

1 Answer 1

2

The serializer in some versions of Camel does not recognise GString type. Hence, you would need to force conversion to string by calling toString()

def v_stringvar = "${var1} text ${var2}";

And then you use it in this way

v_stringvar?.toString()

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.