2
votes

Envoyer la requête POST au serveur, la réponse du serveur est nulle, angulaire - Spring-boot

Je veux envoyer une requête POST avec mon client angular à mon serveur spring-boot.

Le serveur reçoit avec succès les données et la réponse avec 200 Code et corps avec une chaîne qui contient "ok".

Mais le client reçoit null comme réponse.

Code angulaire:

    @CrossOrigin(origins = "http://localhost:9000")
    @PostMapping(value = "/url")
    public ResponseEntity objDataController(@RequestBody ObjData objData) {
        HttpHeaders resHeader = new HttpHeaders();

        resHeader.set("origin", "http://localhost:8080");
        resHeader.set("Content-Type", "application/json");
        resHeader.set("Accept", "application/json");

        //some code

        return ResponseEntity.ok()
                .headers(resHeader)
                .body("ok");
    }
this.http.post(this.URL, JSON.stringify(this.alert), this.httpOptions)
            .subscribe((result: string) => {
                if (result == null || result === 'error') {
                    //if fail;
                } else {
                    //if success;
                }
                console.log('result :' + result);
            })

Code de démarrage de printemps:

httpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Access-Control-Allow-Methods': 'POST, GET'
        })
    };

Dans console.log, obtenez: result: null

Merci


12 commentaires

Pouvez-vous envoyer une capture d'écran de la demande réelle (onglet réseau de la console des navigateurs). Tout fonctionne-t-il sur localhost? Il peut s'agir de problèmes de cors, causés par une demande de contrôle en amont échouant.


Avez-vous regardé la réponse dans la console f12?


@marcel Oui, le serveur et le client sont dans localhost, c'est pourquoi j'ai utilisé @CrossOrigin sur spring-boot


@JensAlenius oui, la réponse dit result: null


dans Angular, le rappel de la méthode d'abonnement est d'abord un succès puis une erreur. Donc HttpClient le gère comme un succès. ex: .subscribe (successCallback, failureCallback) et le succès est appelé comme nous pouvons le voir dans votre console. Je pense que le corps pourrait être nul. Avez-vous vérifié le corps de réponse en f12?


Je ne suis pas un expert en démarrage de printemps et je ne sais pas ce que fait exactement @CrossOrigin , mais avez-vous toujours regardé dans la console des navigateurs (f12, onglet réseau) qu'il s'agit de la bonne requête (avec POST ) et pas un contrôle en amont (avec OPTION)? car normalement avec votre paramètre (port! = 80 et des en-têtes spécifiques définis dans la demande), le navigateur ferait automatiquement une demande de contrôle en amont


@JensAlenius J'imprime la réponse créée lors de l'inscription, ce n'est pas le corps de la réponse?


Pouvez-vous mettre une capture d'écran de votre demande et de votre réponse réseau pour qu'il soit facile à comprendre


En regardant la réponse du réseau dans f12, nous pouvons voir si le serveur renvoie le corps dans la réponse. C'est juste une question de réduire le problème


Ok, j'ai regardé l'onglet réseau f12, et le corps de la réponse n'est pas nul (égal à "ok"), je suppose que le problème est ma fonction angulaire


Bizarre. Essayez d'ajouter les arguments génériques pour la méthode de publication. devrait faire. Utilisez-vous le dernier client http? (angulaire 5 et vers le haut)


@JensAlenius j'essaye d'ajouter , ça ne marche pas et j'utilise angular 7


3 Réponses :


0
votes

J'ai rencontré un problème similaire et cela a aidé à spécifier le type de réponse:

const headers = new HttpHeaders({'Content-Type': 'application/json'});
this.httpClient.delete(url, {headers: headers, responseType: 'text'});


2 commentaires

Merci, mais je suppose que cela ne m'aidera pas, j'utilise POST au lieu de DELETE et mon problème est avec le .subscribe


pourrait encore valoir la peine d'essayer. Qu'entendez-vous par «mon problème est lié à l'abonnement»? Parce que si votre httpClient essaie d'interpréter la chaîne 'OK' comme JSON, il ne retournera pas la chaîne ...



0
votes

C'est la console Chrome qui vous dérange, quand il s'agit d'observables, elle ne peut pas interpréter correctement la valeur. Je suppose que si vous utilisez le résultat dans le bloc "Si succès", cela fonctionnera forcément


0 commentaires

0
votes

Ok, je résout mon problème, je change ceci:

Gson gson = new Gson();
return ResponseEntity.ok()
                .headers(resHeader)
                .body(gson.toJson("ok", String.class));

Par:

return ResponseEntity.ok()
                .headers(resHeader)
                .body("ok");

Merci pour vos réponses! p>


0 commentaires