Erro ao fazer requisição POST

13 respostas
apijavaspring-boot
J

Tenho o código abaixo:

String url = new StringBuilder().append("https://...").toString();
Map<String, Map<String, String>> body = buildBotBody(email,message);
restTemplate.postForEntity(url, body, Void.class);

Essa requisição não precisa de autenticação, ou seja não tem login e senha. Fazendo essa requisição no Postman funciona perfeitamente. Mas quando executo o código acima, obtenho o erro abaixo:

401 Unauthorized

13 Respostas

Jonathan_Medeiros

Como está o curl desta request no postman?

thimor

voce colocou spring-security ao projeto?
se nao colocou, coloque @CrossOrigin ao metodo.

caso tenha ativado o spring-boot, precisa colocacar também na configuracao do spring security isso aqui

@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.cors();
	}
J

Não coloquei spring-security ao projeto.

No caso eu preciso colocar essa anotação @CrossOrigin ao método que está fazendo a requisição?

J

Eu coloquei essa anotação @CrossOrigin acima do método que faz a requisição, mas não funcionou.

J

Eu coloquei no Controller, mas não funcionou.

thimor

era so isso mesmo para funcionar. pq quando a requisicao sai do browser precisa habilitar o cors. no postman voce nao tera problemas. tenta tirar o https, usa so o http mesmo

J

apena com http, não funciona no Postman.

Jonathan_Medeiros

curl é um formato de requisição que o postman permite gerar, queria ver essa informação pra sugerir o que poderia estar faltando no seu código!

Mas pelo que você me disse, acredito que falte algum header, verifique todos os cabeçalhos que a request contém no postman e aplique na sua chamada do restTemplate!

thimor

eu coloquei uma api no heroku, sem spring-security security e funciona bl. O client é react. No seu caso deve estar faltando colocar algum header na requisicao

@RestController
@RequestMapping(value = "/aniversariantes")
public class AniversariantesController {

	@Autowired
	private AssistidoService pessoaService;

	@GetMapping
	@ResponseStatus(value = HttpStatus.OK)
	@CrossOrigin
	public ResponseEntity<List<Assistido>> listarAniversariantes(Integer mes) {
		return ResponseEntity.ok().body(pessoaService.listarAniversariantes(mes));
	}

}

eu ate havia colocado o spring-security mas esta desativado.

@EnableWebSecurity
@ComponentScan(basePackageClasses = TokenAuthenticationService.class)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
    protected void configure(HttpSecurity http) throws Exception {
		http.csrf().disable().authorizeRequests().antMatchers("/**").permitAll();
    }

}
Jonathan_Medeiros

Na sua request você está passando todos os parâmetros corretamente?

Analisando pelo curl que me enviou, acredito que você não esteja fornecendo todos os parâmetros da requisição, por este motivo ocorre o erro 401!

Parâmetros necessários:

api-version: 2016-06-01                           /*Sem ele causa um 400*/
sp: %2Ftriggers%2Fmanual%2Frun                    /*Sem ele causa um 400*/
sv: 1.0                                           /*Sem ele causa um 400*/
sig: zxm46aQnBj3ZTKPOddnnwUgtQZoQcQfixNtXVxAJjPg  /*Sem ele causa um 401*/
J

Mas esses parâmetros estão na url.

Eu teria que setar esses parâmetros separadamente?

J

Fiz um main com o resumo do código para ficar mais fácil testar:

try {
		HttpHeaders requestHeaders = new HttpHeaders();
		requestHeaders.add("Accept",MediaType.ALL_VALUE);
		requestHeaders.setContentType(MediaType.APPLICATION_JSON);
		HttpEntity<?> requestEntity = new HttpEntity<>(requestHeaders);
		String url = new StringBuilder().append("https://prod-12.westeurope.logic.azure.com:443/workflows/fbf4c29cbcad4679b1a1159fff7b07f9/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=zxm46aQnBj3ZTKPOddnnwUgtQZoQcQfixNtXVxAJjPg").toString();
		RestTemplate rest = new RestTemplate();
		rest.exchange(url, HttpMethod.POST, requestEntity, Void.class);
		logger.info("Bot enviado com sucesso!");
	} catch (RestClientException e) {
		logger.error("Erro ao enviar Bot.", e);
		throw e;
	}

No log do console está assim:

21:58:20.025 [main] DEBUG org.springframework.web.client.RestTemplate - HTTP POST https://prod-12.westeurope.logic.azure.com:443/workflows/fbf4c29cbcad4679b1a1159fff7b07f9/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%252Ftriggers%252Fmanual%252Frun&sv=1.0&sig=zxm46aQnBj3ZTKPOddnnwUgtQZoQcQfixNtXVxAJjPg
21:58:20.301 [main] DEBUG org.springframework.web.client.RestTemplate - Accept=[application/json, application/*+json]
21:58:23.020 [main] DEBUG org.springframework.web.client.RestTemplate - Response 401 UNAUTHORIZED

Tentei com queryparams e também com querys parametrizadas, mas não funcionou.

Jonathan_Medeiros

É bem estranho este comportamento, muito provavelmente é algo com o formato em que o restTemplate envia a request, pois não faz sentido a mesma request que funciona no postman falha na aplicação!

Criado 9 de setembro de 2020
Ultima resposta 11 de set. de 2020
Respostas 13
Participantes 3