doubi5127 2017-06-30 08:35
浏览 115
已采纳

GO:Confluence API无法获取所有附件

i am using golang for my application and in this application i tried getting attachments from Confluence, following are detail

req:="https://domain.atlassian.net/wiki/rest/api/content?expand=body.view,version&type=page&start=0&limit="
res, err := w.sendRequest(req)
    if err != nil {
        return nil, err
    }
    if strings.EqualFold(contentID, "") == false {
        if len(res.Results) != 0 {
            for i, _ := range res.Results {
                Log.Info("files processed is:", i)
                extension := filepath.Ext(res.Results[i].Title)
                isExtenstionExclude := isExcludedExtenstion(sbConfig, extension)
                ispathExclude := isExcludedFolder(sbConfig, res.Results[i].Links.Webui)
                if sbgoclient.ExtesionMap[extension] == 0 || isExtenstionExclude == true || ispathExclude == true {
                    binarycount++
                    Log.Info("Excluded by extension" + extension + " for file" + res.Results[i].Title)
                } else {
                    md5HashInBytes := md5.Sum([]byte(res.Results[i].Title))
                    md5HashInString := hex.EncodeToString(md5HashInBytes[:])
                    file_path := parameter[0] + "/" + md5HashInString + strings.Replace(res.Results[i].Title, " ", "", -1)
                    file, err := os.Create(file_path)

                    if err != nil {
                        fmt.Println(err)
                        panic(err)
                    }
                    url_1 := sbConfig.ConfluenceUrl + res.Results[i].Links.Download
                    req, err := http.NewRequest("GET", url_1, nil)
                    resp, _ := w.client.Do(req) // add a filter to check redirect

                    if err != nil {
                        fmt.Println(err)
                        panic(err)
                    }
                    // Close body on function exit
                    defer resp.Body.Close()
                    fmt.Println(resp.Status)

                    size, err = io.Copy(file, resp.Body)

                    if err != nil {
                        panic(err)
                    }

                    defer file.Close()
                    fmt.Printf("%s with %v bytes downloaded", res.Results[i].Title, size)
                    meta := map[string]string{
                        "size": strconv.FormatInt(size, 10),
                    }
                }
            }
        }
    } else {

        if len(res.Results) != 0 {
            for i, _ := range res.Results {
                Log.Info("page indexing is", res.Results[i].Title, "and i value is:", i)
                fmt.Println("hmtl content is", res.Results[i].Body.View.Value)
                fmt.Println("page name is:", res.Results[i].Title)
                md5HashInBytes := md5.Sum([]byte(res.Results[i].Title))
                md5HashInString := hex.EncodeToString(md5HashInBytes[:])
                file_path := parameter[0] + "/" + md5HashInString + strings.Replace(res.Results[i].Title, " ", "", -1) + ".html"
                file, err := os.Create(file_path)

                if err != nil {
                    fmt.Println(err)
                    panic(err)
                }
                defer file.Close()
                html_content := "<html><body>" + res.Results[i].Body.View.Value + "</body></html>"
                err = ioutil.WriteFile(file.Name(), []byte(html_content), 0777)
                if err != nil {
                    fmt.Println("error writing into file", err)
                    panic(err)
                }
                file.Close()                    
        }
func (w *Wiki) sendRequest(req *http.Request) (*vijay_content, error) {
    var testjson vijay_content
    req.Header.Add("Accept", "application/json, */*")
    w.authMethod.auth(req)

    resp, err := w.client.Do(req)
    if err != nil {
        return nil, err
    }
    bodyBytes, _ := ioutil.ReadAll(resp.Body)
    body := string(bodyBytes)

    fmt.Printf("response is %s
", body)
    err = json.Unmarshal(bodyBytes, &testjson)
    if err != nil {
        fmt.Println("error here is", err)
        return nil, err
    }

    switch resp.StatusCode {
    case http.StatusOK, http.StatusCreated, http.StatusPartialContent:

        return &testjson, nil
    case http.StatusNoContent, http.StatusResetContent:
        return nil, nil
    case http.StatusUnauthorized:
        return nil, fmt.Errorf("Authentication failed.")
    case http.StatusServiceUnavailable:
        return nil, fmt.Errorf("Service is not available (%s).", resp.Status)
    case http.StatusInternalServerError:
        return nil, fmt.Errorf("Internal server error: %s", resp.Status)
    }

    return nil, fmt.Errorf("Unknown response status %s", resp.Status)
}

and here in this confluence domain actually i have more than 1000 documents but i am able to download only around 80 to 90, i don't know whats happening here please suggest any changes to be done and following is the struct used to get values from response json

type Links struct {
    Download string `json:"download,omitempty"`
    Self     string `json:"self,omitempty"`
    Webui    string `json:"webui,omitempty"`
}
type View_struct struct {
    Value string `json:",innerxml"`
}
type Body_struct struct {
    View View_struct `json:"view,omitempty"`
}
type Vijay_Results struct {
    ID    string      `json:"id,omitempty"`
    Links Links       `json:"_links,omitempty"`
    Title string      `json:"title,omitempty"`
    Body  Body_struct `json:"body,omitempty"`
}
type vijay_content struct {
    Results []Vijay_Results `json:"results,omitempty"`
    Start   int             `json:"start,omitempty"`
    Limit   int             `json:"limit,omitempty"`
    Size    int             `json:"size,omitempty"`
}
  • 写回答

1条回答 默认 最新

  • dsunj08246 2017-06-30 08:48
    关注

    The API paginates the results. You should fetch the whole list in multiple requests by specifying start and limit.

    E.g. request the list of first 30 documents with start=0&limit=30, then the next 30 with start=30&limit=30, and so on, until you get a response with empty list.

    You can read more details in the docs on pagination.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度
  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao