2015-06-05 23 views
2

我想要使用HTTP協議獲取OrientDb數據庫的列表。但我無法得到預期的迴應,我可以在瀏覽器中獲得。列表使用HTTP協議和golang的OrientDb數據庫

如果我在瀏覽器地址欄中輸入http://localhost:2480/listDatabases然後我有 響應:

{"@type":"d","@version":0,"databases":["MaximDB","GratefulDeadConcerts"],"@fieldTypes":"databases=e"} 

?我怎樣才能使用golang一樣嗎?

我的代碼:

package main 

import (
    "encoding/json" 
    "fmt" 
    "net/http" 
) 

func main() { 
    client := &http.Client{} 
    req, err := http.NewRequest("GET", "http://localhost:2480/listDatabases", nil) 
    req.SetBasicAuth("root", "1") 
    resp, err := client.Do(req) 
    if err != nil { 
     fmt.Printf("Error : %s", err) 
    } 
    fmt.Println("resp") 
    fmt.Println(ToJson(resp)) 
} 

func ToJson(obj interface{}) string { 
    b, err := json.MarshalIndent(&obj, "", " ") 
    if err != nil { 
     fmt.Printf("Error : %s", err) 
    } 
    strJson := string(b) 

    return strJson 
} 

它在輸出控制檯:

resp 
{ 
    "Status": "200 OK", 
    "StatusCode": 200, 
    "Proto": "HTTP/1.1", 
    "ProtoMajor": 1, 
    "ProtoMinor": 1, 
    "Header": { 
     "Connection": [ 
     "Keep-Alive" 
     ], 
     "Content-Type": [ 
     "application/json; charset=utf-8" 
     ], 
     "Date": [ 
     "Fri Jun 05 22:19:23 MSK 2015" 
     ], 
     "Etag": [ 
     "0" 
     ], 
     "Server": [ 
     "OrientDB Server v.2.0.10 (build [email protected]; 2015-05-25 16:48:43+0000)" 
     ], 
     "Set-Cookie": [ 
     "OSESSIONID=-; Path=/; HttpOnly" 
     ] 
    }, 
    "Body": {}, 
    "ContentLength": -1, 
    "TransferEncoding": null, 
    "Close": false, 
    "Trailer": null, 
    "Request": { 
     "Method": "GET", 
     "URL": { 
     "Scheme": "http", 
     "Opaque": "", 
     "User": null, 
     "Host": "localhost:2480", 
     "Path": "/listDatabases", 
     "RawQuery": "", 
     "Fragment": "" 
     }, 
     "Proto": "HTTP/1.1", 
     "ProtoMajor": 1, 
     "ProtoMinor": 1, 
     "Header": { 
     "Authorization": [ 
      "Basic cm9vdDox" 
     ] 
     }, 
     "Body": null, 
     "ContentLength": 0, 
     "TransferEncoding": null, 
     "Close": false, 
     "Host": "localhost:2480", 
     "Form": null, 
     "PostForm": null, 
     "MultipartForm": null, 
     "Trailer": null, 
     "RemoteAddr": "", 
     "RequestURI": "", 
     "TLS": null 
    }, 
    "TLS": null 
} 
+0

雖然您可以嘗試['client.Go'](http://golang.org/pkg/net/http/#Client.Get),但對我來說看起來並不像'go'問題。而不是'client.Do'。服務器日誌中的任何錯誤? –

回答

2

您的要求是很好,這是你想打印出來的反應方式。

您將整個響應對象編組爲JSON,並且您可以看到"Body": {},您的身體缺失的位置。 A *http.Response將不會按照您想要的方式編組爲JSON。這是因爲Body字段不只是string[]bytes,它是io.ReadCloser,JSON封送代碼不會在其上調用.Read

嘗試其中之一,只是得到的迴應身體

var b bytes.Buffer 
_, err = b.ReadFrom(resp.Body) 
if err != nil { 
    log.Fatal("Error : %s", err) 
} 
fmt.Println(b.String()) 

contents, err := ioutil.ReadAll(resp.Body) 
if err != nil { 
    log.Fatal("Error : %s", err) 
} 
fmt.Println(string(contents)) 

或獲得額外的響應元信息,你可以做到這一點

dump, err := httputil.DumpResponse(resp, true) 
if err != nil { 
    log.Fatal("Error : %s", err) 
} 
fmt.Println(string(dump)) 

(該第二旗說true包括身體,否則它只會顯示狀態和頭部ers)