2009-08-24 13 views
6

Próbuję uzyskać dostęp do witryny za pośrednictwem ich eksportu JSON.JSON w Groovy/Grails

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

Używam HTTPBuilder spróbować tego dokonać w Groovy, ale mam problemy. Kiedyś przykładowy kod z http://groovy.codehaus.org/HTTP+Builder wymyślić to:

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

Jednak, kiedy uruchomić test jednostki dla metody po prostu dostać No such property: GET for class: ProjectController groovy.lang.MissingPropertyException: No such property: GET for class: ProjectController które mam problemy zrozumienie.

Odpowiedz

14

Jest kilka problemów z kodem przykładowym. Przede wszystkim, aby uzyskać dostęp do GET i JSON w ten sposób, trzeba je importować statycznie:

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

które uczynią kompilacji kodu, ale nie zakończą się pomyślnie. Twoja wartość url.path wymaga wiodącego '/' (jak pokazano na HTTPBuilder page). Co ważniejsze, JSON, który wraca z wersji the URL you're referencing, ma zupełnie inną strukturę niż struktura zwrócona przez przykładowy kod wykonujący wyszukiwanie w Google. Jeśli załadujesz your URL do bardzo przydatnego JSON Formatter service at CuriousConcept, zobaczysz strukturę. Oto kod, który wyświetla niektóre dane JSON:

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

Nawiasem mówiąc, jest to zmiana łamanie w version 0.5.0 of HTTPBuilder które są istotne dla tego kodu. Jak stwierdza zapowiedzi RC-1 uwalnianiu,

Klasa HTTPBuilder własność URL został przemianowany na uri

Tak więc, jeśli przejść do 0.5.0 w pewnym momencie, musisz użyj uri.path zamiast url.path

0

nie jestem zaznajomiony z HTTPBuilder, ale patrząc na dokumentacji, może być w stanie dostać się z wymianą

http.request(GET, JSON) { 

z

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

może mieć również do:

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

Opieram to na dokumentacji HttpBuilder.request(), która wymaga Method i obiekt (który może być ContentType).

+0

Nie mam przywiązane do HTTPBuilder żadnym odcinku, to właśnie to, co niektóre z najlepszych wpisów Google zaproponował dla JSON połączenia z Grails. Jeśli istnieje inne rozwiązanie, które poleciłbyś, jestem za tym wszystkim, ponieważ nie robię tu dużego postępu. – Kivus

+0

Wiele osób zaleca HttpClient Apache'a, na którym oparty jest program budujący HTTP, więc jest to prawdopodobnie najlepsza opcja. Próbowałem tylko pomóc rozwiązać problem, który wydawał się być błędem kompilacji w twoim skrypcie Groovy. Jeśli program HTTP Builder nie działa, możesz napisać prostą Javę w swoim Groovy, która używa HttpClient, a nawet java.net. *, Chociaż byłaby to nieco więcej kodu. –

-3

Chociaż nie odpowiadając na oryginalne pytanie zauważyłem, że pytasz o inne możliwe biblioteki. Pomijając Groovy, którego nie używałem w tym celu, najlepszą i najprostszą biblioteką Java do budowy klienta usług internetowych jest Jersey, moim zdaniem, z rąk do rąk.

11

Jeśli chcesz tylko do pobierania danych, można to zrobić w Grails w ten sposób:

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

(tylko jako proste alternatywy)

+0

Uważaj tutaj! Ten przykład wycieknie czytnik (i z kolei java.net.HttpURLConnection iz tym, gniazdo!) I nie użyje kodowania znaków określonego przez serwer zdalny (zamiast tego użyje domyślnego kodowania twojej platformy). Innymi słowy: URL.newReader jest ZŁY w ogólnym przypadku – JesperSM

0

możemy analizować tekst JSON z klasą JsonSlurper. Musimy tylko przekazać tekst do metody parseText(), a my możemy odwzorować wartości na Mapy i listy.I coraz treść jest więc bardzo łatwy

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 
}