2009-08-24 15 views
6

Sto tentando di accedere a un sito tramite la loro esportazione JSON.JSON in Groovy/Grails

L'URL è: http://neotest.dabbledb.com/publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp

sto usando HTTPBuilder per cercare di raggiungere questo obiettivo in Groovy, ma sto avendo difficoltà. Ho usato il codice di esempio da http://groovy.codehaus.org/HTTP+Builder a venire con questo:

// 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}" 
     } 
    } 
} 

Tuttavia, quando si esegue il test unità per il metodo che ho semplicemente ottenere No such property: GET for class: ProjectController groovy.lang.MissingPropertyException: No such property: GET for class: ProjectController che io riesco a capire.

risposta

14

Ci sono alcuni problemi con il codice di esempio. Prima di tutto, per accedere GET e JSON in questo modo, è necessario importarli staticamente:

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

che renderà il codice di compilazione, ma non eseguito correttamente. Il tuo valore url.path ha bisogno di un '/' iniziale (come mostrato nello HTTPBuilder page). Ancora più importante, il JSON che torna da the URL you're referencing ha una struttura completamente diversa da quella restituita dal codice di esempio che esegue una ricerca su Google. Se carichi your URL nel molto pratico JSON Formatter service at CuriousConcept, vedrai la struttura. Ecco il codice che avrebbe visualizzare alcuni dei dati JSON:

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

A proposito, c'è un cambiamento di rottura in version 0.5.0 of HTTPBuilder che è rilevante per questo codice. Come afferma l'annuncio RC-1 rilascio,

La proprietà URL classe HTTPBuilder è stata rinominata Uri

Quindi, se si sposta a 0.5.0 ad un certo punto, è necessario usa uri.path invece di url.path

0

io non sono a conoscenza HTTPBuilder, ma guardando la documentazione, si potrebbe essere in grado di cavarsela con la sostituzione

http.request(GET, JSON) { 

con

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

Si può anche essere necessario:

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

Sto basando questo fuori della documentazione per HttpBuilder.request(), che richiede un Method e un oggetto (che può essere un ContentType).

+0

Non ho sposata a HTTPBuilder da qualsiasi tratto, era proprio quello che alcune delle migliori voci di Google ha suggerito per JSON chiamate da Grails. Se c'è un'altra soluzione che consiglieresti, sono tutto a posto, visto che non sto facendo molti progressi qui. – Kivus

+0

Un sacco di gente consiglia HttpClient di Apache, su cui sembra essere basato HTTP Builder, quindi è probabilmente l'opzione migliore. Stavo solo cercando di aiutare a risolvere quello che sembrava essere un errore di compilazione nel tuo script Groovy. Se HTTP Builder non funziona, potresti semplicemente scrivere del Java direttamente nel tuo Groovy che usa HttpClient, o anche java.net. *, Anche se sarebbe un po 'più codice. –

-3

Sebbene non risponda alla domanda iniziale, ho notato che hai chiesto altre possibili librerie. Ignorando Groovy che non ho usato per questo, la migliore e più semplice libreria Java per la costruzione di un client di servizi web è, a mio parere, Jersey, a mani basse.

11

Se si desidera solo per recuperare i dati, è possibile farlo in Grails questo modo:

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" 
} 

(proprio come una semplice alternativa)

+0

Attenzione qui! Questo esempio colpirà il lettore (e a sua volta java.net.HttpURLConnection e con quello, il socket!), E non utilizzerà la codifica dei caratteri specificata dal server remoto (invece utilizzerà la codifica predefinita della piattaforma). In altre parole: URL.newReader è BAD nel caso generale – JesperSM

0

possiamo analizzare il testo JSON con la classe JsonSlurper. Dobbiamo solo alimentare il testo con il metodo parseText() e possiamo mappare i valori su Mappe ed elenchi.E ottenere il contenuto, allora è molto facile

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 
}