2013-08-07 2 views
2

Я прочитал this и еще несколько сообщений в SO и других местах о том, как отправлять почтовый вызов через HttpBuilder с JSON в качестве содержимого данных. Моя проблема заключается в том, что НИКАКИЕ ИЗ РЕШЕНИЙ НЕ РАБОТАЮТ!Еще одна проблема при попытке URL-адреса POST JSON REST через HttpBuilder

Моя проблема немного отличается. У меня есть данные JSON в файле. При попытке отправить на интерфейс REST с завитком:

curl -X POST -u "username:password" -d @/path/to/myFile.json http://localhost:8080/path/here --header "Content-Type:application/json" 

все работает отлично. Вот где я нахожусь (некоторый дополнительный код IS там, не читайте дальше):

def myFile = new File('/path/to/myFile.json') 
if (!myFile.exists()) println "ERROR! Do not have JSON file!" 

def convertedText = myFile.text.replaceAll('\\{', '[') 
convertedText = convertedText.replaceAll('\\}', ']') 

def jsonBldr = new JsonBuilder() 
jsonBldr myFile.text 

println jsonBldr.toString() 

def myClient = new groovyx.net.http.HTTPBuilder('http://username:[email protected]:8080/my/path') 
myClient.setHeaders(Accept: 'application/json') 

results = myClient.request(POST, JSON) { req -> 
    body = [ jsonBldr.toString() ] 
    requestContentType = JSON 
    response.success = { resp, reader -> 
     println "SUCCESS! ${resp.statusLine}" 
    } 

    response.failure = { resp -> 
     println "FAILURE! ${resp.properties}" 
    } 
} 

Это приводит к 'отказу' закрытие с этими данными:

statusLine:HTTP/1.1 400 Exception evaluating property 'id' for java.util.ArrayList, Reason: groovy.lang.MissingPropertyException: No such property: id for class: java.lang.String 

FWIW, нет " id "в моем JSON где угодно. Если я изменил строку «body» с «[jsonBldr.toString()]» на «[convertText]» - вот почему этот код там, я получаю ту же ошибку. Если я вытащу скобки на теле, я получаю сообщение об ошибке, указывающее, что тело не является данными для массива (как его Карта).

Может ли кто-нибудь (гораздо более крупный, чем я) сказать мне, что такое %% $ # @ Я делаю неправильно ???

ответ

4

Вам необходимо JsonSlurper вместо JsonBuilder. После чего реализация будет выглядеть так:

def myFile = new File('/path/to/myFile.json') 
if (!myFile.exists()) println "ERROR! Do not have JSON file!" 

def bodyMap = new JsonSlurper().parseText(myFile.text) 

def myClient = new groovyx.net.http.HTTPBuilder('http://username:[email protected]:8080/my/path') 
modelClient.setHeaders(Accept: 'application/json') 

results = myClient.request(POST, JSON) { req -> 
    requestContentType = JSON 
    body = bodyMap 
    response.success = { resp, reader -> 
     println "SUCCESS! ${resp.statusLine}" 
    } 

    response.failure = { resp -> 
     println "FAILURE! ${resp.properties}" 
    } 
} 

Однако, я не ясно, что разница между myFile и modelFile в вашем коде.

+0

СПАСИБО !!! Не знаю почему, но мне пришлось изменить «requestContextType» с JSON на «URLENC», но теперь это работает! – JoeG

+2

Отдельно, документ (http://groovy.codehaus.org/gapi/index.html?groovy/json/JsonBuilder.html) для метода JsonBuilder.toString гласит: «Сериализовать внутреннюю структуру данных, построенную с помощью построителя, до совместимая строка полезной нагрузки JSON ", поэтому, хотя мне очень нравится groovy, я все еще чувствую, что я нахожусь снаружи, пытаясь войти! Другими словами, учитывая этот документ, как я должен был знать и/или узнать, как сделать эту работу? Извините - вне темы, просто нужно напыщенно! – JoeG

+0

@joeg это было своеобразное объяснение. Мы не «строим» json, а читаем один (slurper). Вы обязательно убедитесь в этом. :) – dmahapatro