第一次用go不清楚如何调用这个类 希望各位帮帮忙

hellsam · 2017-09-01 17:50:35 · 2990 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-09-01 17:50:35 的主题,其中的信息可能已经有所发展或是发生改变。

这个类 我应该如何去调用 login() ,像这种SinAPIClient 怎么把账号密码HOST等数据穿进去等 这样的一个方法 第一次用到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
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2990 次点击  
加入收藏 微博
9 回复  |  直到 2017-09-02 09:01:26
hellsam
hellsam · #1 · 8年之前
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
}
hellsam
hellsam · #2 · 8年之前

请把jpg改txt.jpg

额 发布的代码都乱的 附件发不上来 请下载这个jpg文件 后缀改txt

希望大牛帮帮忙 怎么弄得呢

hellsam
hellsam · #3 · 8年之前

代码都是乱的 重新打包的 发到百度盘了。下载地址 https://pan.baidu.com/s/1o8gG2tO 提取密码 bjr3

polaris
polaris · #4 · 8年之前

问题问的也不清楚,如何调用,你是要远程调用?

代码格式乱了:发布页面右边有发布说明;下边有实时预览,为什么就不能看下呢?

marlonche
marlonche · #5 · 8年之前

要看你是怎么用的SinAPIClient,报的什么错

从上面的代码来看,关键的就是下面3个field

c := &SinAPIClient{
    Username: "xxx",
    Password: "xxx",
    RPC:      xxx,
}

c.Login()
c.APICall()
hellsam
hellsam · #6 · 8年之前
marlonchemarlonche #5 回复

要看你是怎么用的SinAPIClient,报的什么错 从上面的代码来看,关键的就是下面3个field c := &SinAPIClient{ Username: "xxx", Password: "xxx", RPC: xxx, } c.Login() c.APICall()

@marlonche @polaris

我找到一个函数用于封装好的

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

编译通过。但是我不知道如何取返回值

polaris
polaris · #7 · 8年之前

client SinAPIClient 中应该有 APIResult 的吧。

大哥,你就不能好好预览下你发的东西吗? markdown 语法一点都不熟悉的话,能先熟悉下吗?总是这么乱,让我们来给你调格式……

hellsam
hellsam · #8 · 8年之前

@polaris 大哥 希望给个代码 万分感谢!

polaris
polaris · #9 · 8年之前

github.com/nilshell/xmlrpc 库有例子

//  login
err := client.Call("User.login",
    xmlrpc.Struct{"login": "test@localhost.localdomain",
        "password": "password"},
    &result)
check(err)
// fmt.Printf("User.login returned: %v\n", result)

其中 result 就是返回结果。具体例子在 https://github.com/nilshell/xmlrpc/blob/master/example/example.go

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传