Je suis nouveau à Spring et j'essaie de faire une demande de repos avec RestTemplate. Le code Java doit faire la même chose que la commande ci-dessous curl:
curl --data "name=feature&color=#5843AD" --header "PRIVATE-TOKEN: xyz" "https://someserver.com/api/v3/projects/1/labels"
Mais le serveur rejette le RestTemplate avec un 400 Bad Request
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("PRIVATE-TOKEN", "xyz");
HttpEntity<String> entity = new HttpEntity<String>("name=feature&color=#5843AD", headers);
ResponseEntity<LabelCreationResponse> response = restTemplate.exchange("https://someserver.com/api/v3/projects/1/labels", HttpMethod.POST, entity, LabelCreationResponse.class);
Quelqu'un peut-il me dire ce que je fais mal?
Je pense que le problème est que lorsque vous essayez d'envoyer des données au serveur, l'en-tête de type de contenu doit être l'un des deux: "application/json" ou "application/x-www-form-urlencoded". Dans votre cas, c’est: "application/x-www-form-urlencoded" en fonction des paramètres de votre exemple (nom et couleur). Cet en-tête signifie "quel type de données mon client envoie au serveur".
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("PRIVATE-TOKEN", "xyz");
MultiValueMap<String, String> map =
new LinkedMultiValueMap<String, String>();
map.add("name","feature");
map.add("color","#5843AD");
HttpEntity<MultiValueMap<String, String>> entity =
new HttpEntity<MultiValueMap<String, String>>(map, headers);
ResponseEntity<LabelCreationResponse> response =
restTemplate.exchange("https://foo/api/v3/projects/1/labels",
HttpMethod.POST,
entity,
LabelCreationResponse.class);
Vous devez définir le type de contenu sur application/json. Content-Type doit être défini dans la requête. Ci-dessous le code modifié pour définir le type de contenu
final String uri = "https://someserver.com/api/v3/projects/1/labels";
String input = "US";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("PRIVATE-TOKEN", "xyz");
HttpEntity<String> request = new HttpEntity<String>(input, headers);
ResponseEntity<LabelCreationResponse> response = restTemplate.postForObject(uri, request, LabelCreationResponse.class);
Ici, HttpEntity est construit avec votre entrée "US" et avec des en-têtes. Faites-moi savoir si cela fonctionne, sinon alors s'il vous plaît partager l'exception . Salut!
Il peut s’agir d’une vérification d’en-tête si l’en-tête est un en-tête Valid, vous vous référez à l’en-tête "BasicAuth"?
HttpHeader headers = new HttpHeaders();
headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED.toString());
headers.add("Accept", MediaType.APPLICATION_JSON.toString()); //Optional in case server sends back JSON data
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<String, String>();
requestBody.add("name", "feature");
requestBody.add("color", "#5843AD");
HttpEntity formEntity = new HttpEntity<MultiValueMap<String, String>>(requestBody, headers);
ResponseEntity<LabelCreationResponse> response =
restTemplate.exchange("https://example.com/api/request", HttpMethod.POST,
formEntity, LabelCreationResponse.class);