Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di ubisum
    Registrato dal
    Mar 2007
    Messaggi
    22

    Servizio REST non funziona con servlet

    Salve a tutti.
    Sto lavorando su Spring, con cui ho creato un progetto Boot, il cui scopo è esporre alcuni servizi REST per l'accesso al database.
    In particolare, ho scritto una classe che espone alcuni servizi, tra cui il seguente:
    codice:
    @RequestMapping(value = "/saveContact", method = RequestMethod.POST)
        public ResponseEntity<Contact> saveContact(@RequestBody Contact contact) {
            
            System.out.println("saveContact");
    
    
            try {
                repository.save(contact);
                return new ResponseEntity<>(contact, HttpStatus.CREATED);
            }
    
    
            catch (Exception e) {
                System.out.println(e.getMessage());
                return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
            }
    
    
        }
    L'oggetto repository è definito come rappresentante della seguente interfaccia:
    codice:
    package it.biagio.repository;
    
    
    import org.springframework.data.repository.CrudRepository;
    
    
    import it.biagio.entities.Contact;
    
    
    public interface ContactInterface extends CrudRepository<Contact, Integer> {
        public Iterable<Contact> findByUserId(int id);
        
    }
    Ho testato il metodo saveContact usando Postman e passando, come body di una richiesta POST, un file in formato JSON:
    codice:
        {
            "name": "daisy",
            "surname": "duck",
            "telephone": "5656565",
            "email": "daisy@paperopoli.it",
            "user": {
                "id": 1,
                "username": "paolino",
                "password": "paperino"
            }
        }
    Ora, vorrei che un'applicazione web (sempre creata in Spring, che lavora su Tomcat 9), basata su servlet, fosse in grado di leggere i dati di un nuovo contatto da una form, creare un testo JSON correttamente formattato e sfruttare il servizio REST della prima applicazione per il salvataggio nel DB.
    La servlet, pertanto, dopo aver creato il JSON, invoca la seguente funzione, definita in una classe di servizio:
    codice:
    public void addContact(String toJSON) throws Exception
        {
            try
            {
                // open connection
                URL url = new URL("http://localhost:8081/Contact/saveContact");
                HttpURLConnection con = (HttpURLConnection)url.openConnection();
                
                // set connection parameters and connect
                con.setDoOutput(true);
                con.setRequestMethod("POST");
                con.setRequestProperty("Content-Type", "application/json");
                con.connect();
                
                // write data
                DataOutputStream output = new DataOutputStream(con.getOutputStream());
                output.writeBytes(toJSON);
                //output.flush();
                output.close();
            }
            
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
    Non ottengo nessun errore, ma alla fine non succede nulla, nel senso che nessuna nuova tupla viene aggiunta alla tabella dei contatti. La stringa creata dalla servlet, poi passata alla classe di servizio, risulta corretto, tant'è che, copiata in Postman e usata come corpo di una richiesta POST, provoca una corretta aggiunta nel DB.
    Secondo voi dov'è l'errore?

    Grazie.
    Ultima modifica di ubisum; 19-06-2017 a 16:33

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da ubisum Visualizza il messaggio
    Non ottengo nessun errore, ma alla fine non succede nulla
    Hai verificato lo status code restituito? (direi di no).

    Comunque:
    a) writeBytes NON è il più appropriato per inviare una stringa (che in questo caso dovrebbe essere in UTF-8). Perché se leggessi la documentazione di writeBytes vedresti che letteralmente "butta via" il byte alto di ogni char.

    b) Visto che saveContact ha una response (che sarà poi in JSON), allora passa nella request anche l'header Accept a "application/json"
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di ubisum
    Registrato dal
    Mar 2007
    Messaggi
    22
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Hai verificato lo status code restituito? (direi di no).

    Comunque:
    a) writeBytes NON è il più appropriato per inviare una stringa (che in questo caso dovrebbe essere in UTF-8). Perché se leggessi la documentazione di writeBytes vedresti che letteralmente "butta via" il byte alto di ogni char.

    b) Visto che saveContact ha una response (che sarà poi in JSON), allora passa nella request anche l'header Accept a "application/json"
    Ciao.
    Grazie per la risposta.
    È successa una cosa strana: ho modificato il codice precedente per attendere anche una risposta, oltre ad inviare la richiesta POST:
    codice:
    public void addContact(String toJSON) throws Exception
        {
            try
            {
                // open connection
                URL url = new URL("http://localhost:8081/Contact/saveContact");
                HttpURLConnection con = (HttpURLConnection)url.openConnection();
                byte[] postData = toJSON.getBytes(StandardCharsets.UTF_8);
                
                // set connection parameters and connect
                con.setDoOutput(true);
                con.setDoInput(true);
                con.setRequestMethod("POST");
                con.setRequestProperty("Content-Type", "application/json");
                con.setRequestProperty("charset", "utf-8");
                con.setRequestProperty("Content-Length", Integer.toString(postData.length));
                //con.setUseCaches(false);
                con.connect();
                
                // transform Contact into JSON format
                //String toJSON = JSON.toJSONString(contact);
                System.out.println(toJSON);
                
                // write data
                DataOutputStream output = new DataOutputStream(con.getOutputStream());
                //output.writeBytes(toJSON);
                output.write(postData);
                //output.flush();
                //output.close();
                
                int responseCode = con.getResponseCode();
        
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
    
    
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
    
    
                //print result
                System.out.println("Response code: " + responseCode);
                System.out.println(response.toString());
                
                output.close();
            }
            
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
    Ora riesco a salvare nel DB i nuovi contatti.
    Perdona la domanda da neofita: il fatto di non attendere la risposta può causare problemi?

    Grazie dell'aiuto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.