API REST Woocommerce

Bonjour,

Je cherche à récupérer dans mon application les nom et stock des produits d'une boutique woocommerce.
ça fonctionne à un détail près: seul 10 produits sont récupérés.

En revanche quand je passe directement l'url de la requête dans Safari, l'intégralité des produits sont bien affichés.

J'en déduis que l'API limite le nombre de produits envoyés quand une application autre qu'un navigateur les réclame.
Ma déduction est-elle une hypothèse farfelue?
Si oui, j'aimerais bien savoir ce qui cloche et si non, j'aimerais bien savoir comment lever cette limitation. Je n'ai pas trouvé.

J'ai bien tenté d'interroger ChatGPT qui m'a judicieusement proposé d'ajouter le paramètre "per_page": -1 au paramètre de la requête (j'utilise la bibliothèque Almofire pour ceux qui connaissent) mais cela n'a rien changé.

Réponses

  • LarmeLarme Membre

    Oui cela sent la pagination.
    Sans connaître l'API, c'est difficile de dire ce qu'il en ait.
    Alamofire ne t'aidera pas, c'est juste un wrapper autour de URLSession. Et ajouter per_page, ou page en paramètre, bah ça dépend ce que l'API accepte et prend en compte...
    Quand tu parles de l'URL dans Safari, tu parles de quoi exactement ?

  • RocouRocou Membre

    @Larme a dit :

    Quand tu parles de l'URL dans Safari, tu parles de quoi exactement ?

    Par exemple ceci fonctionne parfaitement:
    https://www.yoursitename.com/wp-json/wc/v3/products?consumer_key=XXXX&consumer_secret=XXXX

    (en remplaçant bien sûr les clé par les vraies et yousitename par le vrai site....)

    J'obtiens bien tous les produits.

  • CéroceCéroce Membre, Modérateur

    J'ai le même avis que @Larme, c'est sans aucun doute en rapport avec la pagination.

  • RocouRocou Membre
    mars 2023 modifié #5

    Oui, vous avez raison.
    (J'avais une erreur dans mon code qui faisait que seuls 10 produits s'affichaient. J'ai corrigé.)
    Mais maintenant j'arrive à la limite de 100 produits par page. Si je demande plus, je ne reçois plus rien. C'est une limite de l'API.

    EDIT:
    "Large queries can hurt site performance, so per_page is capped at 100 records. If you wish to retrieve more than 100 records, for example to build a client-side list of all available categories, you may make multiple API requests and combine the results within your application."

    Bon, je progresse pas à pas. A chaque problème résolu en voilà immédiatement un autre :D

  • RocouRocou Membre
    mars 2023 modifié #6

    J'ai modifié mon code pour afficher le nom et stock des produits woocommerce ET les variations.
    La modification pour afficher les variations m'empêche de compiler avec un message très curieux au niveau de la ligne "var body". Le connaissez-vous ?
    Failed to produce diagnostic for expression; please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the project

    Voici mon bout de code, si à tout hasard quelqu'un voit une ânerie, merci de me la montrer :-) (je sais que .name n'est pas idéal compte tenu de la possibilité d'avoir des doublons mais je ne crois pas que le problème vienne de là)

    struct ContentView: View {
        @State var produits: [Produit] = [] // la liste de produits à afficher
        @State private var produitSelectionne: Int?
        @State var products: [Product] = [] //produits woo
        @StateObject var viewModel = ProductViewModel()
    
         var body: some View {
            HStack{
                List(viewModel.products, id: \.name) { product in
                    VStack(alignment: .leading) {
                        Text(product.name)
                            .font(.headline)
    
                        if let variations = product.variations {
                            ForEach(variations, id: \.id) { variation in
                                Text("Variation: \(variation.attributes[0].option), Stock: \(variation.stock_quantity)")
                                    .font(.subheadline)
                            }
                        } else {
                            Text("Stock: \(product.stock_quantity)")
                                .font(.subheadline)
                        }
                    }
                }
                .onAppear {
                       viewModel.fetchProducts()
                        }
    
    
    
            } //Fin premier HStack
    
        } //fin body
    
    }
    
  • CéroceCéroce Membre, Modérateur

    @Rocou a dit :
    Oui, vous avez raison.
    Mais maintenant j'arrive à la limite de 100 produits par page. Si je demande plus, je ne reçois plus rien. C'est une limite de l'API.

    Je ne suis pas sûr que ce soit clair pour toi, mais ce que tu dois faire n'est pas d'augmenter la tailles des pages (10 produits/page est déjà un bon compromis) mais de demander les pages suivantes. Voilà pourquoi @Larme disait de passer un paramètre page dans l'URL.

  • CéroceCéroce Membre, Modérateur

    Voici mon bout de code, si à tout hasard quelqu'un voit une ânerie, merci de me la montrer

    Je ne vois rien d'évident. Dans ce genre de cas, extrais des bouts de vues dans une autre vue ou désactive du code pour voir où ça ne passe pas.

    P.S.: c'est bizarre d'avoir des @State pour les produits. La vue devrait y accéder par le ViewModel, c'est son rôle.

Connectez-vous ou Inscrivez-vous pour répondre.