删除文章

确定要删除这篇文章吗?

取消
确定

go showapi.com接口

     阅读(244)  2019-06-17 22:59:47

showapi.com提供了很多有意思的api,现在用go语言简单的封装下就可以用了。url的组装规则见文档

目前提供了三个接口

  • 获取组装后的url
  • http请求返回字符串
  • http请求返回json

源码如下:

package showapi

import (
    "crypto/md5"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "sort"
    "strings"
    "time"
)

type Showapi struct {
    Secret  string
    MainUrl string
    AppId   string
    Method  string
    Gzip    string
}

func New(secret string, mainurl string, appid string) *Showapi {
    result := Showapi{}
    result.Secret = secret
    result.MainUrl = mainurl
    result.AppId = appid
    return &result
}

func (api *Showapi) Url(appParams map[string]string) string {
    params := make(map[string]string)
    params["showapi_appid"] = api.AppId
    params["showapi_timestamp"] = time.Now().Format("20060102150405")
    params["showapi_sign_method"] = "md5"
    params["showapi_res_gzip"] = "1"

    for k, v := range appParams {
        params[k] = v
    }

    keys := []string{}
    for k, _ := range params {
        keys = append(keys, k)
    }
    sort.Strings(keys)

    sortResult := []string{}
    for _, key := range keys {
        sortResult = append(sortResult, key, params[key])
    }

    urlResult := []string{api.MainUrl, "?"}
    sign := fmt.Sprintf("%x", md5.Sum([]byte(strings.Join(sortResult, "")+api.Secret)))
    for _, key := range keys {
        urlResult = append(urlResult, key, "=", params[key], "&")
    }
    urlResult = append(urlResult, "showapi_sign=", sign)
    return strings.Join(urlResult, "")
}

func (api *Showapi) GetString(appParams map[string]string) (string, error) {
    url := api.Url(appParams)
    r, err := http.Get(url)
    if err != nil {
        return "", err
    }
    defer r.Body.Close()
    b, err := ioutil.ReadAll(r.Body)
    if err != nil {
        return "", err
    }
    return string(b), nil
}

func (api *Showapi) GetJson(appParams map[string]string, result interface{}) error {
    url := api.Url(appParams)
    r, err := http.Get(url)
    if err != nil {
        return err
    }
    defer r.Body.Close()
    return json.NewDecoder(r.Body).Decode(result)
}

用法,如获取文本笑话:

package showapi

import (
    "fmt"
)

type (
    Content struct {
        Id    string `json:"id"`
        Title string `json:"title"`
        Text  string `json:"text"`
        Type  int    `json:"type"`
        Ct    string `json:"ct"`
    }

    Body struct {
        AllPages    int       `json:"allPages"`
        Contentlist []Content `json:"contentlist"`
    }

    TextJoke struct {
        Showapi_res_error string `json:"showapi_res_error"`
        Showapi_res_id    string `json:"showapi_res_id"`
        Showapi_res_code  int    `json:"showapi_res_code"`
        Showapi_res_body  Body   `json:"showapi_res_body"`
    }
)

func GetTextJoke(page, maxResult int) (*TextJoke, error) {
    appParams := make(map[string]string)
    appParams["page"] = fmt.Sprintf("%d", page)
    appParams["maxResult"] = fmt.Sprintf("%d", maxResult)

    api := New("21b693f98bd64e71a9bdbbxxxxxxxxx", "http://route.showapi.com/341-1", "17262")
    jsonResult := TextJoke{}
    err := api.GetJson(appParams, &jsonResult)
    return &jsonResult, err
}

文章评论

Keep it simple,stupid
文章数
300
总访问量
444306
今日访问
644
最近评论

xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部