Partage
  • Partager sur Facebook
  • Partager sur Twitter

VB.NET utilisation API

    19 septembre 2021 à 14:05:19

    Bonjour, 

    Je développe une petite application VB.net avec une Windows Forms qui me permet de récupérer des données d'une API.

    L'API utilise des fichier JSON sous la forme : 

    "data": [
            {
                "info1": "",
                "user": {
                    "infoUser1": ""
                }
            }]

    Pour l'instant je récupère les données comme cela dans un DataGridView : 

     Dim obj As Object = JsonConvert.DeserializeObject(Of Object)(response.Content)
            For i = 0 To obj.count
                DGW.Rows.Add(obj.("data")(i)("user")("infoUser1"))
            Next

    Le problème c'est que l'API contient un total de 1125 données et ici elle ne me retourne que les 6 premiers ? 

    Edit : Je comptais les mauvaise données 😅

    Dim obj As Object = JsonConvert.DeserializeObject(Of Object)(response.Content)
    Dim jsonArray As JArray = obj("data")
            For i = 0 To jsonArray.Count - 1
                Dim data As JObject = jsonArray(i)
                DGW.Rows.Add(data("user")("infoUser1"))
            Next

    Ca résout le problème :) 

    Après plusieurs recherche j'ai vus que beaucoup de personne passe par une classe supplémentaire

    Le problème est que je ne sais pas comment organiser la classe et faire la boucle for: 

            Dim obj = JsonConvert.DeserializeObject(Of Name)(response.Content)
            'For i = 0 To obj.count
            DGW.Rows.Add(obj.infoUser1)
            'Next
    Public Class Name
    	Public infoUser1 As String
    End Class
    

    Ici il ne me retourne rien, car je pense que je ne spécifie pas la liste Data et User...

    Je vous remercie d'avance pour votre aide

    -
    Edité par DeveloSt 20 septembre 2021 à 13:10:01

    • Partager sur Facebook
    • Partager sur Twitter

    Mes Applications Android: Good-Luck(today), Mathx

      20 septembre 2021 à 12:46:44

      ça pourrait être dans le constructeur de ta classe que tu fais ta boucle (le constructeur ayant en paramètre la chaine correspondant au response.Content
      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2021 à 13:30:05


        J'hésite a laisser comme cela, car c'est une petite application qui ne sera pas amené à évoluer.  

        umfred a écrit:

        ça pourrait être dans le constructeur de ta classe que tu fais ta boucle (le constructeur ayant en paramètre la chaine correspondant au response.Content

         Merci pour ta réponse, je pense savoir comment faire :) 

        Sinon c'est un autre problème et j'ai pas encore commencé à réfléchir sur le sujet : 

        Depuis l'API je récupère des dates... Il me faut faire un compteur de date en fonction du numéros de la semaine : 

        Exemple 

        Semaine 38 

        je récupère : 21/09, 23/09, 25/09

        Donc en Semaine 38 j'ai 3

        Est ce qu'il existe un moyen simple de retrouver les numéros de semaine et les dates correspondante facilement ? 

        Edit : 

        Peut être donner une date, regarder quelle semaine et à partir de la faire le compteur... 



        -
        Edité par DeveloSt 20 septembre 2021 à 13:34:42

        • Partager sur Facebook
        • Partager sur Twitter

        Mes Applications Android: Good-Luck(today), Mathx

          20 septembre 2021 à 14:09:19

          https://docs.microsoft.com/fr-fr/dotnet/api/system.globalization.calendar.getweekofyear?view=net-5.0 

          une année c'est 52 semaines (parfois 53); donc pourquoi pas un tableau de 53 entiers, et incrémenter la case correspondant à la semaine; ou un dictionnaire dont la clé est le numéro de la semaine et la valeur, ton compteur (les 2 sont assez similaires)

          • Partager sur Facebook
          • Partager sur Twitter
            20 septembre 2021 à 19:47:40

            Le passage par une classe supplémentaire, très probablement un DTO, permet d'isoler la couche Données de la couche Business, qui permet de très facilement changer de couche de Données.

            Très pratique, même pour un petit projet, car cela permet d'avoir une couche de données pour les tests très facilement configurable/bidouillable, via des fichiers plat ou des mock, etc...

            En cherchant un peu, tu devrais trouver des générateurs automatiques/proxys de ces DTO et de quoi les gérer facilement (souvent à base d'attributs .NET).

            Une DataGridView et un JsonConvert dans une même méthode ? Ca sent l'application monolithique pas testable tout ça. :euh:

            Pour les numéros de semaines, je ne crois pas qu'il y ait un standard international et les règles "françaises" sont assez casse-couilles (1er Mercredi de l'année, etc...). Vérifiez que ce qu'implémente le framework .NET suit les règles de votre client, qui n'est pas forcément ceux des States.

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              25 septembre 2021 à 13:25:26

              J'ai eu un peu de temps hier et aujourd'hui :) 

              Du coup je donne le code de l'application complet et fonctionnelle dans le but d'apprendre et de l'améliorer. 

              L'application récupère des données depuis une API et un fichier Excel. 

              Depuis l'API je récupère : 

              - Nom

              - Lieux

              - Date

              Depuis le fichier Excel, je récupère : 

              - Zone de distance (a partir du lieux) 

              Une image : 

              Pour l'instant je n'ai fait qu'une classe qui ressemble à ceci : 

              Imports System.Globalization
              Imports Microsoft.Office.Interop
              Imports Newtonsoft.Json
              Imports Newtonsoft.Json.Linq
              Imports RestSharp
              Imports OleDbConnection = System.Data.OleDb.OleDbConnection
              
              Public Class Form1
              
              
                  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
              Handles MyBase.Load
                      TextBox1.Text = DateTime.Now.ToString.Substring(6, 4)
                      fonctionnement()
                  End Sub
              
                  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
                      fonctionnement()
                  End Sub
              
                  Private Sub fonctionnement()
                      Label3.Text = "Chargement en cours"
                      ' Variable Récupération Data API
                      Dim Jsonobj As Object
                      Dim JsonArr As JArray
              
                      ' Connexion a l'API
                      Dim client As RestClient
                      Dim response As IRestResponse
                      Dim request = New RestRequest(Method.[GET])
                      request.AddHeader("Authorization", "APIKey")
              
                      ' Calendrier Francais
                      Dim dfi = DateTimeFormatInfo.CurrentInfo
                      Dim calendar = dfi.Calendar
              
              
              
                      ' **********************************
                      'Indiquer le nombre de Colonnes
                      ' **********************************
                      Dim NumSemaine As Integer = 1
                      DGW.ColumnCount = 56
                      DGW.Columns(0).Name = "idUser"
                      DGW.Columns(1).Name = "Noms"
                      DGW.Columns(2).Name = "Zone"
                      For i = 3 To 55
                          DGW.Columns(i).Name = NumSemaine
                          NumSemaine = NumSemaine + 1
                      Next
              
              
              
                      ' **************************************
                      'Récuperer tous les utilisateurs
                      ' **************************************
                      client = New RestClient("URL/user")
                      client.Timeout = -1
                      response = client.Execute(request)
              
                      Jsonobj = JsonConvert.DeserializeObject(Of Object)(response.Content)
                      JsonArr = Jsonobj("data")
                      For i = 0 To JsonArr.Count - 1
                          Dim data As JObject = JsonArr(i)
              
                          ' Ajouter 5 zones pour chaque utilisateurs
                          For U = 1 To 5
                              DGW.Rows.Add(data("id"), data("lastname"), U)
                          Next
                      Next
              
              
              
              
                      ' ********************************
                      ' Recupérer toutes les données : 500/500
                      '**********************************
                      client = New RestClient("URL/user")
                      client.Timeout = -1
                      response = client.Execute(request)
                      Jsonobj = JsonConvert.DeserializeObject(Of Object)(response.Content)
                      Dim totalResult As Integer = Jsonobj("total")
                      Dim Skip As Integer = 0
              
                      ' Variable 2 dimension ligne, colonne
                      Dim NbrJour(DGW.Rows.Count - 1, DGW.Columns.Count - 1) As Integer
              
              
                      While totalResult > 0
              
                          ' *************************************************************************
                          ' Récuperation et calculs des données nbr jours travaillé/semaine/distance/personne
                          ' *************************************************************************
                          client = New RestClient("URL/Mission?limit=500&skip=" + Skip.ToString)
                          client.Timeout = -1
                          response = client.Execute(request)
              
                          Dim obj As Object = JsonConvert.DeserializeObject(Of Object)(response.Content)
                          Dim JsonArray As JArray = obj("data")
              
              
                          For i = 0 To JsonArray.Count - 1
              
                              Dim data As JObject = JsonArray(i)
                              Dim weekOfyear As String = calendar.GetWeekOfYear(data("date"), dfi.CalendarWeekRule, DayOfWeek.Thursday)
              
                              Dim cmd As OleDbCommand
                              Dim cn As OleDbConnection
                              Dim zone As String
              
                              Dim ExcelFile As String = AppDomain.CurrentDomain.BaseDirectory + "Zone.xlsx"
              
                              cn = New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + ExcelFile + "; Extended Properties = 'Excel 8.0;HDR=Yes'")
                              cmd = New OleDbCommand("select [Zone] from [Feuil1$] where [Lieux]='" + data("site")("city").ToString + "'", cn)
                              cn.Open()
                              If cmd.ExecuteScalar <> Nothing Then
                                  zone = cmd.ExecuteScalar.ToString
                              End If
                              cn.Close()
              
              
                              For a = 0 To DGW.Rows.Count - 1
              
                                  For b = 3 To DGW.Columns.Count - 1
              
                                      If zone = DGW.Rows(a).Cells(2).Value And data("date").ToString.Substring(0, 4) = TextBox1.Text And weekOfyear = DGW.Columns(b).HeaderText.ToString And data("user")("id").ToString = DGW.Rows(a).Cells(0).Value Then
                                          NbrJour(a, b) += 1
                                      End If
              
                                      DGW.Rows(a).Cells(b).Value = NbrJour(a, b)
                                  Next
                              Next
                          Next
              
                          totalResult = totalResult - 500
                          Skip = Skip + 500
                          Label3.Text = "Chargement en Terminé"
                      End While
              
              
              
                      DGW.Columns(1).SortMode = DataGridViewColumnSortMode.NotSortable
                      DGW.Columns(2).SortMode = DataGridViewColumnSortMode.NotSortable
                      DGW.Columns(1).DefaultCellStyle.BackColor = Color.LightCyan
                      DGW.Columns(2).DefaultCellStyle.BackColor = Color.LightCyan
              
                      'DGW.Rows(0).Frozen = True 'Block row 1
                      DGW.ColumnHeadersDefaultCellStyle.BackColor = Color.LightCyan
              
                      DGW.Columns(0).Visible = False 'Column 1 not visible 
                      DGW.Columns(1).Frozen = True ' Block column 2
                      DGW.Columns(2).Frozen = True ' Block Column 3
                  End Sub
              
              
              End Class
              

              Edit : 

              Merci pour vos réponses, 

              bacelar a écrit:

              Le passage par une classe supplémentaire, très probablement un DTO, permet d'isoler la couche Données de la couche Business, qui permet de très facilement changer de couche de Données.

              Un DTO, c'est un peu comme j'ai fait dans mon premier post ? 

              DeveloSt a écrit:

                      Dim obj = JsonConvert.DeserializeObject(Of Name)(response.Content)
                      'For i = 0 To obj.count
                      DGW.Rows.Add(obj.infoUser1)
                      'Next
              Public Class Name
              	Public infoUser1 As String
              End Class

              bacelar a écrit:

              En cherchant un peu, tu devrais trouver des générateurs automatiques/proxys de ces DTO et de quoi les gérer facilement (souvent à base d'attributs .NET).

              Il y a un moyen de le générer automatiquement ?

              Sinon c'est quoi la différence entre un ORM et un DTO ? 

              bacelar a écrit:

              Une DataGridView et un JsonConvert dans une même méthode ? Ca sent l'application monolithique pas testable tout ça. :euh:

              Oui, pour l'instant c'est exactement ça :-°

              Je voulais juste arriver à un résultat rapidement avec mes connaissances... 

              Je cherche maintenant à l'améliorer :D

              bacelar a écrit:

              Pour les numéros de semaines, je ne crois pas qu'il y ait un standard international et les règles "françaises" sont assez casse-couilles (1er Mercredi de l'année, etc...). Vérifiez que ce qu'implémente le framework .NET suit les règles de votre client, qui n'est pas forcément ceux des States.

              Je récupère les numéros de la façon suivante à partir de la date : 

              Dim weekOfyear As String = calendar.GetWeekOfYear(data("date"), dfi.CalendarWeekRule, DayOfWeek.Thursday)

              -
              Edité par DeveloSt 27 septembre 2021 à 9:23:15

              • Partager sur Facebook
              • Partager sur Twitter

              Mes Applications Android: Good-Luck(today), Mathx

                27 septembre 2021 à 20:59:40

                >Un DTO, c'est un peu comme j'ai fait dans mon premier post ?

                Non.

                Si la source n'est plus une API Web, vous n'avez pas à changer votre code ? Non.

                >j'ai vus que beaucoup de personne passe par une classe supplémentaire

                C'est cette classe supplémentaire que je suppute être un DTO, que vous semblez considérer comme inutile mais qui, bien utilisée, rend l'architecture bien plus évolutive/gérable/testable/... .

                Moi, je vois que vous prenez les objets sorties directement du cul du désérialisateur JSON pour les "fourrer" directement dans la DataGridView et que la logique de votre affichage est directement dépendant du requête "en dur" sur un fichier Excel.

                Donc, vous faites comment pour tester votre application sans avoir à vous connecter à un serveur Web ou à installer MDAC sur les machines de tests ?

                Vous faites comment pour tester les cas d'erreur ? (Réseau, format de fichier, etc...)

                Résultat : une "application" qui ne gère aucune erreur (le moindre problème et c'est un saut dans l'inconnu), qui n'est pas correctement testable, etc...

                >Il y a un moyen de le générer automatiquement ?

                Plus ou moins oui, mais le but c'est pas de faire du "pissage" de code mais de maintenir la compatibilité entre la source et la destination des données.

                La manière de faire est fonction des framework employés.

                >Sinon c'est quoi la différence entre un ORM et un DTO ?

                C'est quoi la différence entre un Tie-Fighter et un Star-Destroyer ? (DTO : Tie-Fighter ; ORM : Star-Destroyer)

                >Je cherche maintenant à l'améliorer

                Bin, rendez vos applications testables et capables d'évoluées sans avoir à tout refaire à chaque fois.

                >Je récupère les numéros de la façon suivante à partir de la date :

                Je ne connaissais pas la méthode "GetWeekOfYear" qui semble être apparu "récemment" (.NET 5). Pensez donc à bien choisir la valeur du 2ème paramètre pour qu'il corresponde à vos règles comptables. (Et vérifiez que vos comptables les suivent, on est jamais trop prudent)

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                VB.NET utilisation API

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown