这个类 我应该如何去调用 login() ,像这种SinAPIClient 怎么把账号密码HOST等数据穿进去等 这样的一个方法
第一次用到go 希望大牛可以帮帮我, 测试一天了 也都搞不定 总报错 因为急着要调试点东西。所以没办法了
```go
package client
import (
"errors"
"fmt"
log "github.com/Sirupsen/logrus"
"github.com/nilshell/xmlrpc"
)
type SinAPIClient struct {
Session interface{}
Host string
Url string
Username string
Password string
RPC *xmlrpc.Client
}
type APIResult struct {
Status string
Value interface{}
ErrorDescription string
}
type XenAPIObject struct {
Ref string
Client *SinAPIClient
}
func (c *SinAPIClient) RPCCall(result interface{}, method string, params []interface{}) (err error) {
log.Debugf("RPCCall method=%v params=%v\n", method, params)
p := new(xmlrpc.Params)
p.Params = params
err = c.RPC.Call(method, *p, result)
return err
}
func (client *SinAPIClient) Login() (err error) {
//Do loging call
result := xmlrpc.Struct{}
params := make([]interface{}, 2)
params[0] = client.Username
params[1] = client.Password
err = client.RPCCall(&result, "session.login", params)
if err == nil {
// err might not be set properly, so check the reference
if result["Value"] == nil {
return errors.New("Invalid credentials supplied")
}
}
client.Session = result["Value"]
return err
}
func (client *SinAPIClient) APICall(result *APIResult, method string, params ...interface{}) (err error) {
if client.Session == nil {
log.Errorf("no session\n")
return fmt.Errorf("No session. Unable to make call")
}
//Make a params slice which will include the session
p := make([]interface{}, len(params)+1)
p[0] = client.Session
if params != nil {
for idx, element := range params {
p[idx+1] = element
}
}
res := xmlrpc.Struct{}
err = client.RPCCall(&res, method, p)
if err != nil {
return err
}
result.Status = res["Status"].(string)
if result.Status != "Success" {
log.Errorf("Encountered an API error: %v %v", result.Status, res["ErrorDescription"])
return fmt.Errorf("API Error: %s", res["ErrorDescription"])
} else {
result.Value = res["Value"]
}
return
}
```
<a href="/user/marlonche" title="@marlonche">@marlonche</a>
<a href="/user/polaris" title="@polaris">@polaris</a>
我找到一个函数用于封装好的
```go
func NewSinAPIClient(host, username, password string) (client SinAPIClient) {
client.Host = host
client.Url = "http://" + host
client.Username = username
client.Password = password
client.RPC, _ = xmlrpc.NewClient(client.Url, nil)
return
}
```
于是我将这样调用
client.NewSinAPIClient("192.168.3.172", "root", "test123")
编译通过。但是我不知道如何取返回值
#6
更多评论
```go
package client
import (
"errors"
"fmt"
log "github.com/Sirupsen/logrus"
"github.com/nilshell/xmlrpc"
)
type SinAPIClient struct {
Session interface{}
Host string
Url string
Username string
Password string
RPC *xmlrpc.Client
}
type APIResult struct {
Status string
Value interface{}
ErrorDescription string
}
type XenAPIObject struct {
Ref string
Client *SinAPIClient
}
func (c *SinAPIClient) RPCCall(result interface{}, method string, params []interface{}) (err error) {
log.Debugf("RPCCall method=%v params=%v\n", method, params)
p := new(xmlrpc.Params)
p.Params = params
err = c.RPC.Call(method, *p, result)
return err
}
func (client *SinAPIClient) Login() (err error) {
//Do loging call
result := xmlrpc.Struct{}
params := make([]interface{}, 2)
params[0] = client.Username
params[1] = client.Password
err = client.RPCCall(&result, "session.login", params)
if err == nil {
// err might not be set properly, so check the reference
if result["Value"] == nil {
return errors.New("Invalid credentials supplied")
}
}
client.Session = result["Value"]
return err
}
func (client *SinAPIClient) APICall(result *APIResult, method string, params ...interface{}) (err error) {
if client.Session == nil {
log.Errorf("no session\n")
return fmt.Errorf("No session. Unable to make call")
}
//Make a params slice which will include the session
p := make([]interface{}, len(params)+1)
p[0] = client.Session
if params != nil {
for idx, element := range params {
p[idx+1] = element
}
}
res := xmlrpc.Struct{}
err = client.RPCCall(&res, method, p)
if err != nil {
return err
}
result.Status = res["Status"].(string)
if result.Status != "Success" {
log.Errorf("Encountered an API error: %v %v", result.Status, res["ErrorDescription"])
return fmt.Errorf("API Error: %s", res["ErrorDescription"])
} else {
result.Value = res["Value"]
}
return
}
```
#1
![请把jpg改txt.jpg](https://static.studygolang.com/170902/ff4f9563ec462441527562babdf74391.jpg)
额 发布的代码都乱的 附件发不上来 请下载这个jpg文件 后缀改txt
希望大牛帮帮忙 怎么弄得呢
#2