IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

WEB API et mauvais retour JSON


Sujet :

Services Web

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Par défaut WEB API et mauvais retour JSON
    Bonjour à tous !

    J'ai un problème étrange avec ma WEB API qui est apparu du jour au lendemain...

    J'utilise EF, et asp mvc4 web api.

    J'ai mon contrôleur appelOffre webAPI qui me retourne mes appels d'offre, tous fonctionne bien si je n'inclus pas une autre table à ma requête.

    Je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public class APIappelOffreController : ApiController
        {
            private GAOContainer db = new GAOContainer();
     
     
            // GET api/APIappelOffre
            public List<appelOffre> GetappelOffres()
            {
                var appeloffre = db.appelOffre.Include("statutAppelOffre");
     
                return appeloffre.ToList();
            }
    Ici j'inclus statutAppelOffre et du coup mon retour en JSON n'est pas formé correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    [
      {
        "$id": "1",
        "entreprise": null,
        "technologie": [],
        "statutAppelOffre": {
          "$id": "2",
          "appelOffre": [
            {
              "$ref": "1"
            },
            {
              "$id": "3",
              "entreprise": null,
              "technologie": [],
              "statutAppelOffre": {
                "$ref": "2"
              },
              "document": [],
              "budget": [],
              "cv": [],
              "appelOffreCommentaire": [],
              "projectCommunicator": [],
              "source": null,
              "recette": [],
              "ID": 4,
              "titre": "bbb",
              "pretention": 2222.0,
              "dateAjout": "2012-12-12T00:00:00",
              "dateDebut": "2012-12-12T00:00:00",
              "deadLine": "2012-12-12T00:00:00",
              "dateLivraison": "2012-12-12T00:00:00",
              "lienProjet": "bbbbb",
              "entrepriseID": 1,
              "statutAppelOffreID": 1,
              "sourceID": 1
            }
          ],
          "ID": 1,
          "libelle": "En Cours"
        },
        "document": [],
        "budget": [],
        "cv": [],
        "appelOffreCommentaire": [],
        "projectCommunicator": [],
        "source": null,
        "recette": [],
        "ID": 3,
        "titre": "aaaaa",
        "pretention": 1.0,
        "dateAjout": "2012-12-12T00:00:00",
        "dateDebut": "2012-12-12T00:00:00",
        "deadLine": "2012-12-12T00:00:00",
        "dateLivraison": "2012-12-12T00:00:00",
        "lienProjet": "aaaa",
        "entrepriseID": 1,
        "statutAppelOffreID": 1,
        "sourceID": 1
      },
      {
        "$ref": "3"
      }
    ]

    En fait il met le 2eme appel d'offre à l’intérieur de statutAppelOffre du premier...

    Si j'inclus une autre table comme entreprise, il va faire la même chose dans le premier membre inclut soit entreprise. Même si j'enlève les includes et que j'active le lazyLoading j'ai le même problème.

    Le truc c'est que tous fonctionnait très bien avant je n'ai rien touché et je travail sur une machine virtuelle ...

    Voila le contenu de webApiConfig :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
      public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
     
                // New code:
                var json = config.Formatters.JsonFormatter;
                json.SerializerSettings.PreserveReferencesHandling =
                    Newtonsoft.Json.PreserveReferencesHandling.Objects;
     
                config.Formatters.Remove(config.Formatters.XmlFormatter);
            }
        }

    Merci à vous parceque là je suis vraiment coincé!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Par défaut
    C'est visiblement le même problème ici :
    http://stackoverflow.com/questions/1...ad-of-ref-to-o

    Seulement je n'ai pas la même structure générée par EF donc impossible d'appliquer la méthode une idée ?

    Merci à vous


    EDIT: j'ai créé une nouvelle solution, créé l'edmx à partir de la base et même problème. Ce qui est étonnant c'est qu'il n'y a pas de problème sur d'autres contrôleurs comme 'entreprise' on est pourtant dans un contexte identique lorsque je récupère appelOffre avec inclue le statutAppelOffre et entreprise avec statutEntreprise. Aucun problème si je n'ai qu'un seul appel d'offre dans la bdd.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Par défaut
    J'ai fini par comprendre le problème ...

    Lorsque 2 appels d'offres ont un statut en commun par exemple, pour factoriser le code, une clef ($ref) est attribuée.

    Par contre même si j'ai trouvé la cause, je n'ai pas la solution ...

    Soit il me faut coté Javascript de quoi parser correctement le json.
    Soit, et je préfère cette solution empêcher de factoriser le json.

    Encore un truc pourquoi je récupère les appelOffre liés à une entreprise alors que je n’inclue que entreprise et non entreprise.appelOffre et que le lazyloading est à false ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public partial class DALEntities : DbContext
        {
            public DALEntities()
                : base("name=DALEntities")
            {
                this.Configuration.LazyLoadingEnabled = false;
                this.Configuration.ProxyCreationEnabled = false; 
            }
    Merci à vous

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/05/2015, 11h51
  2. [Généralités] Retour JSON web service
    Par Atsibat dans le forum WinDev
    Réponses: 5
    Dernier message: 10/10/2013, 10h04
  3. [services Web] API generant des Formulaire
    Par subzero82 dans le forum Services Web
    Réponses: 2
    Dernier message: 29/05/2006, 18h40
  4. Réponses: 2
    Dernier message: 30/09/2005, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo