2009-08-24 12 views
6

Estoy intentando acceder a un sitio a través de su exportación JSON.JSON en Groovy/Grails

El URL es: http://neotest.dabbledb.com/publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp

estoy usando HTTPBuilder para tratar de lograr esto en el maravilloso, pero estoy teniendo problemas. He utilizado el código de ejemplo de http://groovy.codehaus.org/HTTP+Builder para llegar a esto:

// perform a GET request, expecting JSON response data 
http.request(GET, JSON) { 
    url.path = 'publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp' 

    // response handler for a success response code: 
    response.success = { resp, json -> 
     println resp.statusLine 

     // parse the JSON response object: 
     json.responseData.results.each { 
      println " ${it.titleNoFormatting} : ${it.visibleUrl}" 
     } 
    } 
} 

Sin embargo, cuando ejecuto la prueba unitaria para el método que simplemente obtener No such property: GET for class: ProjectController groovy.lang.MissingPropertyException: No such property: GET for class: ProjectController la que estoy teniendo problemas para entender.

Respuesta

14

Existen algunos problemas con el código de muestra. En primer lugar, para acceder a GET y JSON de esa manera, es necesario importar de forma estática ellos:

import static groovyx.net.http.Method.GET 
import static groovyx.net.http.ContentType.JSON 

Eso hará que la compilación de código, pero no ejecutar correctamente. Su valor url.path necesita un '/' inicial (como se muestra en el HTTPBuilder page). Más importante aún, el JSON que vuelve de the URL you're referencing tiene una estructura totalmente diferente de la que devuelve el código de ejemplo que realiza una búsqueda en Google. Si carga your URL en el muy útil JSON Formatter service at CuriousConcept, verá la estructura. Aquí está el código que le mostrará algunos de los datos JSON:

println json.name 
println json.id 
json.fields.each { 
    println it 
} 

Por cierto, hay un cambio importante en version 0.5.0 of HTTPBuilder que es relevante para este código. Como dice el anuncio RC-1 de liberación,

La propiedad URL clase HTTPBuilder ha sido renombrado a uri

Por lo tanto, si se muda a 0.5.0 en algún momento, tendrá que use uri.path en lugar de url.path

0

No estoy familiarizado con HTTPBuilder, pero mirando a la documentación, es posible que pueda pasar con la sustitución de

http.request(GET, JSON) { 

con

http.request(Method.GET, ContentType.JSON) { 

Usted también puede tener que:

import groovyx.net.http.Method 
import groovyx.net.http.ContentType 

Estoy basando esto fuera de la documentación para HttpBuilder.request(), lo que requiere un Method y un objeto (que puede ser un ContentType).

+0

No estoy casado con HTTPBuilder por cualquier tramo, que era justo lo que algunas de las principales entradas de Google sugerido para JSON llamadas de Grails. Si hay otra solución que recomiendas, estoy de acuerdo, ya que no estoy progresando mucho aquí. – Kivus

+0

Mucha gente recomienda HttpClient de Apache, en el que parece que se basa HTTP Builder, por lo que es probablemente la mejor opción. Solo estaba tratando de ayudar a resolver lo que parecía ser un error de compilación en tu script de Groovy. Si HTTP Builder no funciona, puedes simplemente escribir algo de Java directamente en tu Groovy que use HttpClient, o incluso java.net. *, Aunque sería un poco más de código. –

-3

Aunque no respondí la pregunta original, me di cuenta de que había preguntado sobre otras posibles bibliotecas. Ignorando Groovy que no he usado para esto, la mejor y más simple biblioteca de Java para construir un cliente de servicios web es Jersey en mi opinión, sin dudas.

11

Si lo que desea es obtener los datos, podría hacerlo en Grails esta manera:

import grails.converters.*; 

def url = new URL("http://neotest.dabbledb.com/publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp") 
def response = JSON.parse(url.newReader()) // response is an instance of JSONObject (see Grails API docs) 

println response.toString(3) // Pretty-printed output 
response.each { key, value -> 
    println "$key = $value" 
} 

(tal como una alternativa simple)

+0

¡Cuidado aquí! Este ejemplo filtrará el lector (y a su vez java.net.HttpURLConnection y con eso, el socket!), Y no usará la codificación de caracteres especificada por el servidor remoto (en su lugar usará la codificación predeterminada de su plataforma). En otras palabras: URL.newReader es MALO en el caso general – JesperSM

0

podemos analizar el texto JSON con la clase JsonSlurper. Solo tenemos que enviar el texto al método parseText() y podemos asignar los valores a Mapas y Listas.Y conseguir el contenido a continuación, es muy fácil

def slurper = new JsonSlurper() 
def result = slurper.parseText('{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}') 

assert result.person.name == "Guillaume" 
assert result.person.age == 33 

assert result.person.pets.size() == 2 
assert result.person.pets[0] == "dog" 
assert result.person.pets[1] == "cat" 

or 

result.person.pets.each{ 
     println it 
}