2015-03-31 29 views
7

Tôi đang tìm kiếm một hướng dẫn nhanh về cách thực hiện các yêu cầu với Golang mô phỏng những yêu cầu sẽ sử dụng với curl. Tôi có hai API mà tôi muốn giao tiếp với cả hai về cơ bản đều hoạt động theo cùng một cách. Một là ElasticSearch, còn lại là Phillips Hue. Tôi biết rằng cả hai đều có thư viện trong Go. Đó không phải là những gì tôi theo đuổi, tôi đang cố gắng tìm hiểu cách thực hiện điều này:Yêu cầu JSON/HTTP Golang như curl

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ 
"query" : { 
    "term" : { "user" : "kimchy" } 
} }' 

Với Golang. Mọi thứ tôi có thể tìm thấy mọi người có vẻ khó mã hóa đến

http://url:port/api/_function?something=value?anotherthing=value... 

Nhưng tôi đã có các đối tượng JSON nổi xung quanh trong phần mềm. Có cách nào mà tôi có thể mô phỏng tính năng -d của CURL với một chuỗi JSON hoặc cấu trúc hoặc một cái gì đó tương tự?

+0

Chỉ cần rõ ràng: vấn đề duy nhất bạn đang gặp phải là 'POST' của một số JSON? Hay toàn bộ điều? (đối số/phân tích cú pháp cờ, mã hóa json .. v.v.). –

+1

mặc dù 'curl' sẽ thực hiện, nhưng việc gửi nội dung trong yêu cầu GET không được khuyến nghị. Mặc dù thông số kỹ thuật không cho phép nó, nhưng máy chủ không bắt buộc phải phân tích cú pháp nó – JimB

+0

@SimonWhitehead Tôi hiểu cú pháp ngôn ngữ. Tôi đang tìm đúng cách để gửi dữ liệu đến và nhận dữ liệu từ, một API. (1) Tôi muốn hiểu cách thức hoạt động của nó. (2) Tôi chỉ cần thực hiện một vài lần trong ứng dụng của mình, dựa trên một số dữ liệu khác. Vì vậy, tôi hơi miễn cưỡng khi mang theo hai thư viện và tất cả các phụ thuộc của họ, để thực hiện hai cuộc gọi đến hai API khác nhau. Tôi biết điều này có lẽ nhiều hơn bất cứ ai muốn giải thích ở đây. Nếu tôi chỉ có thể được chỉ vào một nguồn tài nguyên. Tìm kiếm đang hướng dẫn tôi về cách xây dựng các API - mà tôi không cần. – codecode

Trả lời

16

Khi người nhận xét @JimB chỉ ra, thực hiện yêu cầu GET với nội dung không được đặc tả HTTP/1.1 không cho phép; tuy nhiên, nó cũng không yêu cầu các máy chủ thực sự phân tích cú pháp cơ thể, vì vậy đừng ngạc nhiên nếu bạn gặp phải hành vi lạ.

Điều đó nói rằng, đây là cách bạn sẽ thực hiện một yêu cầu GET với một cơ thể sử dụng một khách hàng golang HTTP:

reader := strings.NewReader(`{"body":123}`) 
request, err := http.NewRequest("GET", "http://localhost:3030/foo", reader) 
// TODO: check err 
client := &http.Client{} 
resp, err := client.Do(request) 
// TODO: check err 

Các máy chủ web sẽ thấy một yêu cầu như thế này:

GET /foo HTTP/1.1 
Host: localhost:3030 
User-Agent: Go 1.1 package http 
Content-Length: 12 
Accept-Encoding: gzip 

{"body":123} 

Để xây dựng một công cụ dòng lệnh như "curl", bạn sẽ cần sử dụng một số gói đi (ví dụ: flag parsingHTTP request handling) nhưng có lẽ bạn có thể tìm thấy những gì bạn cần từ các tài liệu (xuất sắc).

+0

Cảm ơn bạn vì điều này ... bây giờ bạn đã rất tử tế để chỉ ra rằng có lẽ tôi đang đi về điều này sai, những gì là đúng cách? – codecode

+0

@codecode: đó là một điều nhỏ - theo quy ước (và do sự mơ hồ của thông số HTTP) không phải tất cả các phương thức yêu cầu đều được liên kết với nội dung (ví dụ: GET, DELETE) trong khi một số là (ví dụ: PUT, POST, v.v.). Nhưng nếu mục tiêu của bạn là thi đua curl ở golang thì bạn đang đi đúng hướng vì công cụ đó cho phép hành vi bạn mô tả. – maerics

Các vấn đề liên quan