wake-up-neo.com

Spring MVC - Aufruf eines Ruhedienstes aus einem anderen Ruhedienst

Ich habe derzeit ein wirklich seltsames Problem mit dem Aufruf eines REST -Dienstes aus einem anderen, und ich könnte wirklich eine Hand benutzen, um herauszufinden, was ich falsch mache.

Also zunächst einmal ein wenig Kontext:

Ich habe eine Webanwendung, die einen REST -Dienst abruft, um ein Benutzerkonto zu erstellen (der Erklärung halber ist localhost: 8080/register). Früher in der Benutzerreise habe ich einen anderen Dienst angerufen, um die Anmeldeinformationen des Benutzers zu erstellen, localhost:8090/signup, aber ich muss ein paar Dinge in dem Aufruf an/registrieren, damit ich innerhalb des Anrufs einen anderen Endpunkt auf 8090 anrufe diese Informationen (localhost:8090/availability). Um es kurz zu machen: Die webapp ruft localhost auf: 8080/register, das wiederum localhost:8090/availability aufruft.

Wenn ich den Verfügbarkeitsendpunkt direkt anrufe, entweder von einem REST -Client oder der Webapp selbst, funktioniert alles wie erwartet, aber aus irgendeinem merkwürdigen Grund bekomme ich aus dem Aufruf des Registerendpunkts einen HTTP415. Hat jemand einen Einblick in das, was schief läuft?

Der Register-Controller sieht folgendermaßen aus:

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {

    // a load of business logic that validates the user model

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
            userModel.getUsername(), Boolean.class);
    System.out.println(response.getBody());

    // a load more business logic

    return userModel;
}

Und der Verfügbarkeits-Controller sieht folgendermaßen aus:

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public Boolean isUsernameAvailable(@RequestBody String username) {

    // a load of business logic that returns a boolean
    return Boolean.TRUE;
}

Vollständige Offenlegung - In der Praxis habe ich als Inhalt von createUser () tatsächlich mehrere Aufrufe des Aufrufstapels gezeigt. Dabei wurde dieselbe Klasse verwendet wie beim Aufruf der Dienste von der Webapp aus (was in diesem Zusammenhang perfekt funktioniert). , und ich gebe in isUsernameAvailable nicht einfach nur true zurück (weil das dumm wäre), aber dies ist die einfachste Version des Codes, der das Problem repliziert. 

Ich gehe derzeit davon aus, dass ich etwas tue, das ich selbst besiegen werde, wenn ich es sehe, aber ich habe diesen Code zu lange angestarrt, um ihn nicht mehr sehen zu können.

Bearbeiten Vikdors Kommentar unten hat dieses Problem für mich gelöst. Ich habe die createUser-Methode folgendermaßen geändert:

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {

    // a load of business logic that validates the user model

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
    ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
            userModel.getUsername(), Boolean.class);
    System.out.println(response.getBody());

    // a load more business logic

    return userModel;
}
4
Rob

A HTTP415 bedeutet Nicht unterstützter Medientyp . Das bedeutet, dass isUsernameAvailable eine Eingabe im JSON-Format erwartet, aber das ist nicht das, was sie bekommt.

Versuchen Sie, explizit Content-Type: application/json-Header zu Ihrer HTTP-Anfrage hinzuzufügen, indem Sie folgende Schritte ausführen:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
restTemplate.put(uRL, entity);
1

Verwenden Sie RestTemplate.exchange, das unten erwähnt wird:

ResponseEntity responseEntity = RestTemplate.exchange (endPointURL, HttpMethod.GET/POST/PUT/DELETE, HttpEntity/Kopfzeilen, uriVariables)

endpointURL - SOAP Endpunkt-URL, die der Dienst REST verbrauchen muss.

HTTPMethod - Methodentyp wie GET, PUT, POST, DELETE usw.

HTTPEntity - Soap erfordert einen obligatorischen Absender/Header/{a}. Stellen Sie sicher, dass Sie den Headernamen und -wert als Schlüssel-Valye-Paar in HTTP-Headern festlegen.

uriVariables - (Object ... urivariables) wie String.class, Integer.class

Sie sollten auch den Parameter connectTimeout , isSSLDisabled , responseCached in den Konstruktor einfügen, während Sie request an restTemplate generieren.

0
Aastha Jain