Restituire risposta in formato Json anziché xml

di il
4 risposte

Restituire risposta in formato Json anziché xml

Ho un Rest Service caricato su IIS, quando lo lancio su browser e inserisco un URI nella barra degli indirizzi ottengo una response in formato xml.
Ora vorrei ottenerla in formato Json, quindi presumo di dover cambiare il valore di Accept header nella http response: se è corretto, dove devo cercare la http response e cambiare il valore? Facendo una ricerca nell'intera solution non ho trovato nulla che corrispoda a una coppia header-valore dove viene assegnato il content type text/xml, nè qualcosa che somigli a una http rsponse: significa che xml è il formato di default e non viene quindi specificato?
Dovrei aggiungere i settaggi della http response nei web config per ciascuno dei servizi nella mia solution?
Oppure potrei dover cambiare le impostazioni della http rsponse direttamente su IIS?

4 Risposte

  • Re: Restituire risposta in formato Json anziché xml

    brobh ha scritto:


    Ho un Rest Service caricato su IIS, quando lo lancio su browser e inserisco un URI nella barra degli indirizzi ottengo una response in formato xml.
    Ora vorrei ottenerla in formato Json [...]
    Tutto dipende da come hai implementato la tua API.

    Se restituisci solamente i dati (quindi parliamo di oggetti), il framework si occupa di serializzarli nel formato più vicino a quello richiesto da chi invoca l'endpoint: nel caso del browser, quindi, viene usato il formato HTML oppure l'XML.

    Se la richiesta specifica application/json nell'header HTTP Accept, allora verrà usato il formato JSON.

    Se vuoi decidere tu, serializza e restituisci direttamente un JsonResult, ad esempio, ovvero restituisci i dati già serializzati nel formato che preferisci (anche se in questo caso lo vedo come una limitazione delle possibilità).
  • Re: Restituire risposta in formato Json anziché xml

    Se vuoi decidere tu, serializza e restituisci direttamente un JsonResult, ad esempio, ovvero restituisci i dati già serializzati nel formato che preferisci
    [UPDATE]
    Sì, vorrei serializzare e restituire direttamente un Json Result, ho provato a fae così:
    1) Nel mio controller aggiungo questo metodo che trasforma l'entità su cui lavorano i metodi restituiti dalle actions in una stringa JSON:
     private Object JSONSerilaizeMovie(Movie mov)
            {
                // Serializaion  
                Movie movObj = new Movie();
                movObj .attribute1 = mov.attribute1;
                movObj .attribute2 = mov.attribute2;
             
                // Convert Movie object to JSON string format   
                string jsonData = JsonConvert.SerializeObject(movObj );
                return jsonData;
                }
    2) E richiamo il metodo dentro la stessa action del controller che avevo già prima, passandogli come argomento l'entità restituita, ovvero la stringa JSON generata sopra:
       [System.Web.Http.HttpPost]
            [System.Web.Http.Route("api/MyController/print")]
            public Object Print(int userID)
            {
                var returnedMovie= businessLogicVar..GetUserById(userID);
                return JSONSerilaizeUser(returnedMovie);
            }
    
    Ho fatto lo stesso per un Object di tipo Int e sto testando l'api che mi restituisce l'int generato da un metodo della BLL, analogamente a quanto sopra.
    Però quando vado a testare l'api su browser mi viene restituito sempre un xml, sebbene la visualizzazione sia leggermente diversa a prima, cioè questa:
    This XML file does not appear to have any style information associated with it. The document tree is shown below.
    <z:anyType xmlns:d1p1="http://www.w3.org/2001/XMLSchema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" i:type="d1p1:string">63</z:anyType>
    
  • Re: Restituire risposta in formato Json anziché xml

    Come fanno i grandi del mondo, cito me stesso...

    Alka ha scritto:


    Se vuoi decidere tu, serializza e restituisci direttamente un JsonResult [...]
  • Re: Restituire risposta in formato Json anziché xml

    Ho fatto così:

    Ho spostato la procedura per decidere la restituzione in formato JSON di default sul Proxy ch richiamerà le rest API anziché implementarla nel contoller del Rest service.
    L'ho implementata così:

    nel Proxy definisco due proprietà, una per il segmento di URI comune a tutte le api ("/api/NomeController") e una per il client, che userà la precedente per impostarsi il BaseAddrss.
    private string _webApiEndopoint;  
            private HttpClient _client;
    Il segmento di URI/endpoint comune l'ho definito nel app.Config, dentro il tag <configuration>
    <commonEndpointSegment value="/api/Movie" />
    

    Nel costruttore del proxy inizializzo quindi il client: A _webApiEndopoint assegno il segmento di endopoint comune ("/Api/NomeController"), usando ConfigurationManager per inizializzare la stringa e recuperare il valore dell'endpoint. Dopodiché inizialitzzo il client, che avrà come BaseAddres il precedente valore, al quale aggiunge il segmento successivo dell'URI (diverso per ogni API esposta dal rest service) -->
    public RestProxy ( )
            {
                
                _webApiEndopoint = ConfigurationManager.GetSection("commonEndpointSegment").ToString();            
                _client = new HttpClient();            
                _client.BaseAddress = new Uri(_webApiEndopoint) ;    // endpoint a cui punta client
            }
    Dopodiché ho definito un metodo che prende in input una response di tipo HttpRespnseMessage e restituisce il risultato convertito in JSon:
    
    T GetResult<T>(HttpResponseMessage response)
            {            
                    var content = response.Content.ReadAsStringAsync().Result;   
                    return JsonConvert.DeserializeObject<T>(content);            
            }
    

    Questo metodo lo richiamo all'interno dei metodi che richiamano le operazioni esposte dalla web API , ad es.:
    public int InsertMovie(Movie movie)   
            {                        
                HttpResponseMessage response = _client.PostAsJsonAsync<Movie>("AddMovie", movie).Result;   
                return GetResult<int>(response);
            }

    Quando invece il metodo prende in input più di un parametro, al suo interno inizializzo una variabile della classe MovieController per restituire l'oggetto, e poi passo quella variabile in input in PostAsJsonAsync(), ad es.:
    public List<Movie> GetMovieByProperties(string title, int year)
            {
                var _movieController = new MovieController();  // controller del RestService che espone le operazioni
                List<Movie> returnedDvdOfMovie = _movieController .GetMovieByProperties(title, year);
    
                HttpResponseMessage response = _client.PostAsJsonAsync<List<Movie>>("SearchMovie", returnedDvdOfMovie ).Result;
                return GetResult<List<Movie>>(response);
            }

    Nell'app.config del Proxy ho anche aggiunto questo indirizzo endpoint sotto il tag <client> :
    <endpoint address="http://localhost/RESTService/MovieController.cs" binding="basicHttpBinding"  />
    
    Credo innanzitutto di aver sbagliato la modifica nell'app.config, perché quando testo uno dei metodi del proxy ottengo errore
    "Configuration system failed to initialize"
    ...

    Poi mi chiedevo se ho fatto bene a inizializzare il controller all'interno di alcuni metodi per poter usare PostAsJsonAsync, o se dovrei evitarlo usando qualche altro metodo di tipo httpClient che mi permetta di passare in input tutti i parametri desiderati
Devi accedere o registrarti per scrivere nel forum
4 risposte