Estoy enviando un tipo de aplicación / JSON desde el cliente cartero a una API Java que reenvía todas las peticiones a la API específica para ese caso. En este caso concreto, tengo una API de inicio de sesión y quiero código de centro escuchado esta JSON:
JSON del cartero
{
"name": "random name",
"password": "random passwd"
}
La API que hace el delantero
@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String redirectHttpRequest(HttpServletRequest request, @Value("${endpoint}") String newURL,
HttpServletResponse response) throws IOException {
try {
RestTemplate restTemplate = new RestTemplate();
String result = null;
String body = IOUtils.toString(request.getReader());
if (request.getMethod().equals("GET")) {
// result = restTemplate.getForObject(redirectUrl.toString(), String.class);
} else if (request.getMethod().equals("POST")) {
result = restTemplate.postForObject(newURL, body, String.class);
}
return result;
} catch (HttpClientErrorException e) {
System.out.println(e);
return "OLA";
}
}
Esa nueva dirección URL es la dirección URL si la otra API es (que, en este caso, es localhost:8080
y es del application.properties
archivo).
He probado la API de inicio de sesión a través de cartero y funciona, pero cuando intento conectar a esa API adelante me dieron el siguiente error:
org.springframework.web.client.HttpClientErrorException: 415 nulo.
Me gustaría saber lo que estoy haciendo mal o una forma alternativa de hacerlo.
El valor del cuerpo pasa al segundo punto final
La clase de usuario
Usuario public class {
private String name;
private String password;
private List<String> groups;
public User(String name, String password) {
this.name = name;
this.password = password;
this.groups = new ArrayList<String>();
}
public User() {
}
public String getName() {
return this.name;
}
public String getPassword() {
return this.password;
}
public List<String> getGroups() {
return this.groups;
}
public String toString() {
return "User: " + this.name + "\nGroups: " + this.groups;
}
El problema es que usted está recibiendo el 415
código de error. Eso significa que su /login
punto final no está esperando que el tipo de carga útil que le está enviando, ver aquí
415 (no admitido Tipo de papel)
La respuesta de 415 error indica que la API no es capaz de procesar presentarse Tipo de medios del cliente, como se indica en la solicitud de cabecera Content-Type. Por ejemplo, una solicitud de cliente incluyendo datos formateados como application / xml se recibe una respuesta 415 si el API sólo está dispuesto para procesar datos formateados como application / json.
Por ejemplo, el cliente carga una imagen como imagen / svg + xml, pero el servidor requiere que las imágenes utilizan un formato diferente.
Creo que es esto porque cuando se llama postForObject
, no está diciendo el tipo de soporte de la carga útil. Así que en lugar de enviar la cadena JSON solo, que necesita para envolverlo en una HttpEntity
que sostiene el cuerpo y también una cabecera que especifica el tipo de soporte de la carga útil va a reenviar. Probar esto:
...
} else if (request.getMethod().equals("POST")) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
HttpEntity<String> entity = new HttpEntity<>(body, headers);
result = restTemplate.postForObject(newURL, entity, String.class);
}
...