2017-06-30 7 views
1

J'utilise golang pour mon application et dans cette application i essayé d'obtenir des pièces jointes à partir de Confluence, voici des détailsGO: API Confluence ne reçoit pas toutes les pièces jointes

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\n", 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) 
} 

et dans cette confluence domaine en fait j'ai plus de 1000 documents mais je suis en mesure de télécharger seulement autour de 80 à 90, je ne sais pas ce qui se passe ici s'il vous plaît suggérer des changements à faire et suivre est la structure utilisée pour obtenir des valeurs de réponse 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"` 
} 
+0

'Je ne peux télécharger qu'environ 80 à 90': Que se passe-t-il? Vous obtenez une erreur? Le programme se bloque? Autre chose? – Carpetsmoker

+0

aucun programme ne se termine, signifie l'exécution se termine –

Répondre

1

L'API effectue une pagination des résultats. Vous devez extraire la liste entière dans plusieurs demandes en spécifiant start et limit.

E.g. demande la liste des 30 premiers documents avec start=0&limit=30, puis les 30 suivants avec start=30&limit=30, et ainsi de suite, jusqu'à ce que vous obteniez une réponse avec une liste vide.

Vous pouvez lire plus de détails à the docs on pagination.

+0

comment je peux confirmer qu'il n'y a pas de page suivante –

+0

C'est l'une des sections sur cette page de docs que j'ai liée (voir 'Comment savoir s'il y a plus de pages?'). Ou vous pouvez simplement arrêter quand vous obtenez une page vide. –

+0

J'ai utilisé la pagination comme indiqué dans le document –