Проблемы с вводом json в Groovy HttpBuilder

У меня проблемы с передачей параметров json в веб-экшен. Я знаю, что веб-экшен работает по указанному URL-адресу http://projects.example.net/example/bugnetwebservice.asmx/MobileBuildAction, так как я тестировал его с почтальоном с параметрами json:

{
    featureIdStr: 31,
    actionStr: 1,
    comment: "Hello world"
}

и получите ответ:

{
    "d": "Succeeded"
}

Однако всякий раз, когда я пытаюсь запустить его в groovy, я получаю такой ответ:

Jun 10, 2016 9:54:25 AM net.sf.json.JSONObject _fromBean
INFO: Property 'value' of class org.codehaus.groovy.runtime.GStringImpl has no read method. SKIPPED
Failure: 500

Вот мой код:

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1')
import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*

def http = new HTTPBuilder("http://projects.example.net/")
def issueId = 31
def msg = "Build Failed"
def jsonBody = [:]
jsonBody.put("featureIdStr", issueId)
jsonBody.put("actionStr", 0)
jsonBody.put("comment", "${msg}: <a href='http://www.google.com'}'>Googles Job</a>")
http.request(POST, JSON) {
    uri.path = "/example/bugnetwebservice.asmx/MobileBuildAction"
    body = jsonBody

    response.success = { resp ->
        println "Success! ${resp.status}"
    }

    response.failure = { resp ->
        println "Failure: ${resp.status}"
    }
}

Пожалуйста помоги!


person iHowell    schedule 10.06.2016    source источник
comment
Можете ли вы попробовать изменить последнее значение put на "${msg}: <a href='http://www.google.com'>Googles Job</a>".toString()? Я думаю, что сталкивался с похожими проблемами, связанными с обработкой String и GString в HTTPBuilder.   -  person bdkosher    schedule 10.06.2016


Ответы (1)


jsonBody.put("comment", "${msg}: http://www.google.com'}'>Работа Google")

"" в Groovy создает строку Groovy (она же GString). GStrings прекрасны — они допускают этот синтаксис ${} — но у них есть некоторые проблемы с сериализацией и десериализацией самих себя. Есть отличный ответ StackOverflow, объясняющий, что с этим делать.

В любом случае, вкратце, между этим сообщением и моим собственным опытом: каждый раз, когда вы сравниваете или может быть сериализуете свою Groovy String, сначала вызывайте toString() для нее.

Я бы подумал о написании вашего кода, например:

def commentValue = "${msg}: <a href='http://www.google.com'}'>Googles Job</a>"

jsonBody.put( commentValue.toString() )
person RyanWilcox    schedule 10.06.2016