2009-08-24 25 views
6

Tôi đang cố gắng truy cập một trang web thông qua xuất JSON của họ.JSON trong Groovy/Grails

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

Tôi đang sử dụng HTTPBuilder để thử và thực hiện điều này trong Groovy, nhưng đang gặp khó khăn. Tôi đã sử dụng mã ví dụ từ http://groovy.codehaus.org/HTTP+Builder để đến với điều này:

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

Tuy nhiên, khi tôi chạy thử nghiệm đơn vị cho phương pháp này tôi chỉ đơn giản là có được No such property: GET for class: ProjectController groovy.lang.MissingPropertyException: No such property: GET for class: ProjectController mà tôi đang gặp rắc rối hiểu biết.

Trả lời

14

Có một số vấn đề với mã mẫu của bạn. Trước hết, để truy cập GET và JSON theo cách đó, bạn cần phải nhập tĩnh chúng:

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

Điều đó sẽ làm cho việc biên dịch mã, nhưng không chạy thành công. Giá trị url.path của bạn cần một '/' hàng đầu (như được hiển thị trên HTTPBuilder page). Quan trọng hơn, JSON quay lại từ the URL you're referencing có cấu trúc hoàn toàn khác với cấu trúc được trả về bởi mã ví dụ thực hiện tìm kiếm của Google. Nếu bạn tải your URL vào JSON Formatter service at CuriousConcept rất tiện dụng, bạn sẽ thấy cấu trúc. Dưới đây là mã sẽ hiển thị một số dữ liệu JSON:

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

Bằng cách này, có thay đổi đột phá trong version 0.5.0 of HTTPBuilder có liên quan đến mã này. Theo các tiểu bang công bố RC-1 phát hành,

Lớp HTTPBuilder tài sản URL đã được đổi tên Uri

Vì vậy, nếu bạn di chuyển đến 0.5.0 tại một số điểm, bạn sẽ cần phải sử dụng uri.path thay vì url.path

0

Tôi không quen thuộc với HTTPBuilder, nhưng nhìn vào các tài liệu, bạn có thể nhận được bởi với thay

http.request(GET, JSON) { 

với

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

Bạn cũng có thể phải:

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

Tôi đang căn cứ vào tài liệu này cho HttpBuilder.request(), yêu cầu Method và một đối tượng (có thể là ContentType).

+0

Tôi không được kết nối với HTTPBuilder theo bất kỳ khoảng thời gian nào, nó chỉ là một vài trong số các mục Google được đề xuất cho cuộc gọi JSON từ Grails. Nếu có một giải pháp khác bạn muốn giới thiệu, tôi là tất cả vì nó, vì tôi không tiến bộ nhiều ở đây. – Kivus

+0

Rất nhiều người khuyên bạn nên sử dụng HttpClient của Apache, mà Trình tạo HTTP xuất hiện dựa trên, vì vậy đây có thể là lựa chọn tốt nhất. Tôi chỉ cố gắng giúp giải quyết những gì dường như là một lỗi biên dịch trong kịch bản Groovy của bạn. Nếu Trình tạo HTTP không hoạt động, bạn chỉ có thể viết một số Java thẳng trong Groovy của bạn sử dụng HttpClient, hoặc thậm chí là java.net. *, Mặc dù nó sẽ có nhiều mã hơn một chút. –

-3

Mặc dù không trả lời câu hỏi ban đầu, tôi nhận thấy bạn đã hỏi về các thư viện có thể khác. Bỏ qua Groovy mà tôi chưa từng sử dụng cho điều này, thư viện Java tốt nhất và đơn giản nhất để xây dựng một máy khách dịch vụ web là theo ý kiến ​​của tôi, theo ý kiến ​​của tôi.

11

Nếu bạn chỉ muốn lấy dữ liệu, bạn có thể làm điều đó trong Grails theo cách này:

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

(cũng giống như một sự thay thế đơn giản)

+0

Cẩn thận ở đây! Ví dụ này sẽ rò rỉ trình đọc (và ngược lại java.net.HttpURLConnection và với nó, socket!), Và nó sẽ không sử dụng mã hóa ký tự được chỉ định bởi máy chủ từ xa (thay vào đó nó sẽ sử dụng mã hóa mặc định của nền tảng của bạn). Nói cách khác: URL.newReader là BAD trong trường hợp chung – JesperSM

0

chúng ta có thể phân tích cú pháp JSON văn bản với lớp JsonSlurper. Chúng ta chỉ phải nạp văn bản vào phương thức parseText() và chúng ta có thể các giá trị được ánh xạ tới Bản đồ và Danh sách.Và việc lấy nội dung sau đó rất dễ dàng

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 
}