2017-08-01 1 views
0

Je souhaite communiquer avec un serveur dans la zone Java en utilisant la classe RestTemplate. Mais quand j'accède à mon serveur avec RestTemplate, il montre seulement 403 (interdit) erreur.Spring RestTemplate.postForEntry, renvoie l'erreur 403

mon code contrôleur:

@Controller(value="homeController") 
public class HomeController { 

@RequestMapping(value="/test") 
public @ResponseBody Map<String, String> test(@RequestParam(value="message", required=false, defaultValue="hell world") String message){ 

    Map<String, String> map = new HashMap<String,String>(); 
    map.put("greeting", message); 

    return map; 
} 

code du côté client:

@Test 
public void test2(){ 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 

    MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>(); 
    map.add("message", "test"); 

    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); 

    ResponseEntity<String> response = restTemplate.postForEntity(url, request , String.class); 
    System.out.println(response.getBody()); 

} 

Si le code fonctionne avec succès, la console devrait sortie mot "test".

EDIT: Lorsque j'accède au contrôleur, avec mon navigateur Web, il affiche correctement les données json.

Maintenant, Comment réparer le code pour communiquer au serveur sur la méthode POST? merci

+0

403 indique qu'il vous manque l'authentification. Avez-vous la sécurité du printemps sur le chemin de la classe? Comment authentifiez-vous votre demande? – baao

+0

Merci vraiment. Le problème était la sécurité du printemps. Je n'ai pas terminé la configuration de sécurité, et quand je supprime cette source de sécurité, le problème ci-dessus a été résolu! Je vous remercie. – PLAYMAKER

+0

J'ai répondu à la question avec une classe de configuration rapide pour une authentification de base simple – baao

Répondre

0

Comme vous avez dit que vous utilisez à la sécurité du printemps, vous pouvez simplement ajouter une demande Interceptor et ajouter l'authentification. Spring va créer un mot de passe aléatoire si vous n'en définissez pas un; il sera connecté dans la console de sorte que vous pouvez simplement le copier à partir de là.

RestTemplate restTemplate = new RestTemplate(); 
restTemplate.setInterceptors(Collections.singletonList(new BasicAuthorizationInterceptor("username", "yourpassword"))); 

Une autre option (mieux) consiste à configurer vous-même l'authentification. Un simple dans la mémoire autoriserait

@Configuration 
@EnableWebSecurity 
public class RestSecurityConfiguration extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().fullyAuthenticated(); 
     http.httpBasic(); 
     http.csrf().disable(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
       .inMemoryAuthentication() 
       .withUser("username").password("yourpassword").roles("ADMIN"); 
    } 
} 
0

Vous devez spécifier les types de méthodes HTTP que votre méthode "test" gère. Vous pouvez le faire en @RequestMapping annotation de cette façon:

@RequestMapping(path="/test", method = {RequestMethod.GET, RequestMethod.POST}, 
       consumes = "application/x-www-form-urlencoded") 
+0

merci de répondre. J'ai fait ce que tu as suggéré. Mais cela ne fonctionne pas .... – PLAYMAKER

+0

Essayez d'ajouter consumes = "application/x-www-form-urlencoded" à @RequestMapping –