Errore 406 api rest (usando springboot)

di il
2 risposte

Errore 406 api rest (usando springboot)

Salve, avevo chiesto aiuto per un altra problematica dove non riuscivo a stabilire una connessione con un sito contenente un database in formato json protetto da api key. CI sono riuscito alla fine; il problema è che non riesco ad implementarlo correttamente usando springboot e visualizzarlo quindi in postman.
Allora volevo chiedervi gentilmente una mano per comprendere dove sbaglio, se ho sbagliato a chiamare la funzione nel controller, o mancano delle librerie, oppure ho sbagliato completamente approccio per far visualizzare i dati.
Perchè al momento dell'esecuzione, su postman mi esce l'errore 406 con scritto: "error": "Not Acceptable",
"trace": "org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

Mentre in java mi esce questo errore in console: Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
2021-12-22 09:03:07.167 INFO 15196 --- [on(2)-127.0.0.1] inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.


Qui sotto vi scrivo i vari codici che ho usato:
Questa è l'applicazione di lancio di springboot
package It.ProvaConnessione.DemoConnessione;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import It.ProvaConnessione.DemoConnessione.model.CollegamentoApiKey;

@SpringBootApplication
public class DemoConnessioneApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoConnessioneApplication.class, args);		
	}
}

Questo è il mio restcontroller:
package It.ProvaConnessione.DemoConnessione.controller;
import org.springframework.web.bind.annotation.RestController;
import It.ProvaConnessione.DemoConnessione.model.ClasseProva;
import It.ProvaConnessione.DemoConnessione.model.CollegamentoApiKey;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RestController
public class SimpleRestController {		
	@GetMapping("/connessione")
	public CollegamentoApiKey esempio() {
		
		return new CollegamentoApiKey();		
	}	
}
Infine questo è il codice che contiene il metodo per stabilire una connessione con quella pagina e che se usata da per se mi da il contenuto di quella pagina nella console:
package It.ProvaConnessione.DemoConnessione.model;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.rmi.AccessException;

	public class CollegamentoApiKey{
		public void func()throws Exception{
		URL url = new URL("https://findwork.dev/api/jobs");		
		URLConnection urlConn = url.openConnection();
		urlConn.setRequestProperty("Authorization","Token ****************");
		urlConn.setRequestProperty("Accept","*/*");
		urlConn.setRequestProperty("Connection","keep-alive");				
		BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8"));
		String line;
		line = reader.readLine();
		System.out.println(line);	
		}	
}	
    

2 Risposte

  • Re: Errore 406 api rest (usando springboot)

    LeoTheGamer ha scritto:


    Perchè al momento dell'esecuzione, su postman mi esce l'errore 406 con scritto: "error": "Not Acceptable",
    "trace": "org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

    Mentre in java mi esce questo errore in console: Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
    Ci sono diverse cose che non vanno. Innanzitutto NON è una buona/bella cosa fare nel controller un return new CollegamentoApiKey() così come hai fatto.
    Anche perché questa classe CollegamentoApiKey NON è un "bean" Java, non possiede proprietà e non ha metodi getter/setter.
    Se restituisci da un controller @RestController un bean è tipicamente perché si vuole "mapparlo" in una forma tipo JSON/XML ma appunto dovrebbe avere delle proprietà.

    E comunque nel controller hai invocato il costruttore di CollegamentoApiKey (che esiste, c'è quello di default) ma il codice di accesso a quel sito l'hai messo in un metodo func() e questo NON l'hai invocato!!

    Scusa se lo dico ma se i dubbi sono a questo livello ..... hai una montagna di 10km da scalare (riguardo Java) e non hai fatto neanche 1 metro.
  • Re: Errore 406 api rest (usando springboot)

    Giacche i tuoi sembrano semplicemente dei test

    Se stai usando come spero l'architettura di MVC

    la tua classe CollegamentoApiKey è quella che veiene definita Service e pertanto necessita dell'annotazione Service. (Ti consiglio di leggerti le best pratics del caso perchè viene consigliato di creare un'interfaccia per la gestione dei Service nel controller). Comunque..
    
    package It.ProvaConnessione.DemoConnessione.model;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.rmi.AccessException;
    
    	@Service
    	public class CollegamentoApiKey{
    	
    		public void func()throws Exception{
    		URL url = new URL("https://findwork.dev/api/jobs");		
    		URLConnection urlConn = url.openConnection();
    		urlConn.setRequestProperty("Authorization","Token ****************");
    		urlConn.setRequestProperty("Accept","*/*");
    		urlConn.setRequestProperty("Connection","keep-alive");				
    		BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8"));
    		String line;
    		line = reader.readLine();
    		System.out.println(line);	
    		}	
    }	
    
    Fatto ciò nel tuo controller devi importare il service.. puoi farlo sevendoti dell'annotation Autowired (questo ti permetterà di utilizzare classi singelton ottimizzando le prestazioni dei service)
    
    package It.ProvaConnessione.DemoConnessione.controller;
    import org.springframework.web.bind.annotation.RestController;
    import It.ProvaConnessione.DemoConnessione.model.ClasseProva;
    import It.ProvaConnessione.DemoConnessione.model.CollegamentoApiKey;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @RestController
    public class SimpleRestController {	
    
    	@Autowired 
    	private CollegamentoApiKey collegamentoApiKey;
    	
    	@GetMapping("/connessione")
    	public CollegamentoApiKey esempio() {
    		collegamentoApiKey.func();
    		return new ResponseEntity<>("SpringBoot Test",HttpStatus.OK);
    	}	
    }
    
    Non ho testato il tuo codice (e non ho aggiunto gli import) ma in linea generale dovrebbe funzionare.
    Ti consiglio comunque, così come ti ha consigliato andbin di recuperare qualche risorsa da cui poter studiare (Udemy anche può essere utile nel tuo caso in quanto per spring sono presenti sia fonti italiane che inglesi)
Devi accedere o registrarti per scrivere nel forum
2 risposte