peticion http desde spring

Iniciado por ryhuso, 19 Abril 2021, 12:31 PM

0 Miembros y 1 Visitante están viendo este tema.

ryhuso

hola , no se si alguien me puede ayudar, quiero enviar una peticion http desde mi apirest para dar de alta un dispositivo en otro servicio.


@PostMapping("/dispositivos")
@ResponseStatus(code = HttpStatus.CREATED)
public  ResponseEntity<?> crear(@Valid @RequestBody Dispositivo dispositivo, BindingResult result) throws Exception {

Dispositivo dispositivonew = null;
Map<String, Object> response = new HashMap<>();
if (result.hasErrors()) {
List<String> errors = result.getFieldErrors().stream()
.map(err -> "El campo  '" + err.getField() + "' " + err.getDefaultMessage())
.collect(Collectors.toList());
response.put("errors", errors);
return new ResponseEntity<Map<String, Object>>(response, HttpStatus.BAD_REQUEST);
}

try {
peticionHttpPut(dispositivo);
dispositivonew = dispositivoService.save(dispositivo);
} catch (DataAccessException e) {
response.put("mensaje", "Error realizar al insertar en la base de datos!");
response.put("error", e.getMessage().concat(": ").concat(e.getMostSpecificCause().getMessage()));
return new ResponseEntity<Map<String, Object>>(response, HttpStatus.INTERNAL_SERVER_ERROR);

}


response.put("mensaje", "El Dispositivo ha sido creado con éxito!");
response.put("dispositivo", dispositivonew);
return new ResponseEntity<Map<String, Object>>(response, HttpStatus.CREATED);



}

public void peticionHttpPut(Dispositivo dispositivo) throws Exception {

URL url = new URL("https://hu3-gp9yw4dci7.azureiotcentral.com/api/preview/devices/"
+ dispositivo.getIdentificadorDispositivo());

HttpURLConnection conexion = (HttpURLConnection) url.openConnection();
conexion.setRequestMethod("PUT");
conexion.setDoOutput(true);
conexion.addRequestProperty("Authorization",
"SharedAccessSignature sr=a8b19977-9c37-4e01-bc86-f5990544bcb8&sig=gaSLKfM9MUo6Fsx9XVjY%3D&skn=admin&se=1650104456226");
conexion.setRequestProperty("Content-Type", "application/json");


String nombre = dispositivo.getNombre();
String instanceOf = "dtmi:modelDefinition:a2zj2t:b6dfy";

Map<String, Object> map = new HashMap<>();
map.put("displayName", nombre);
map.put("instanceOf", instanceOf);
map.put("simulated", false);
map.put("approved", true);
JSONObject json = new JSONObject(map);

String jsonInputString = json.toString();

try (OutputStream os = conexion.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);

}


}




lo que quiero hacer es que cuando entre a mi solicitud de de alta en mi base de datos y también haga la petición put que tengo en el método, pero solo me inserta en la base de datos y no me hace lo otro.




rub'n

#1
Pienso que lo mejor seria que crearas otro metodo con la anotacion @PutMapping, logrando que tengas cada metodo para una unica operacion (PUT, POST,  GET...

Aqui usas un POST para hacer un save a la misma vez que quieres tambien actualizar un item.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

Ese no es el error por que quiero que realice un post en mi apirest y un put en la petición http que es para crear una plantilla en una aplicación de microsoft.

ryhuso

Cita de: rub'n en 19 Abril 2021, 12:48 PM
Pienso que lo mejor seria que crearas otro metodo con la anotacion @PutMapping, logrando que tengas cada metodo para una unica operacion (PUT, POST,  GET...

Aqui usas un POST para hacer un save a la misma vez que quieres tambien actualizar un item.

lo que pasa es que si ejecuto post me pone un id aleatorio por eso uso el put para poner el que yo quiero

rub'n

Cita de: ryhuso en 19 Abril 2021, 12:50 PM
Ese no es el error por que quiero que realice un post en mi apirest y un put en la petición http que es para crear una plantilla en una aplicación de microsoft.

Entiendo que el save lo esta haciendo bien... o no?

manda el log que arroja este metodo peticionHttpPut()


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

Cita de: rub'n en 19 Abril 2021, 12:56 PM
Entiendo que el save lo esta haciendo bien... o no?

manda el log que arroja este metodo peticionHttpPut()
no arroja ningún error, pero se que no se ejecuta por que en la pagina web donde tiene que aparecer el dispositivo creado no existe.
Probando el método solo si me crea lo que quiero pero al ejecutarlo desde el controller creo que viene el problema, no se si tengo que configurar algo o mandar la petición de otro modo.

ryhuso

Cita de: ryhuso en 19 Abril 2021, 13:05 PM
no arroja ningún error, pero se que no se ejecuta por que en la pagina web donde tiene que aparecer el dispositivo creado no existe.
Probando el método solo si me crea lo que quiero pero al ejecutarlo desde el controller creo que viene el problema, no se si tengo que configurar algo o mandar la petición de otro modo.
el save si lo ejecuta bien

rub'n

#7
Doc, create otro método con la anotación @PutMapping para exponer tu endpoint de manera sincrona con RestTemplate, ella actua en otra capa de abstracción sin tocar el low level api con HttpURLConnection a mano...

Para consumirla usa un cliente estilo HttpClient de Java 11 que es ahora nativo, OKHttpClient, retrofit etc. y te ahorras mas dolor de cabeza, mas facil de depurar etc.

Y por favor, intentemos ser mas explícitos a la hora de notificar un potencial problema con nuestro codigo.

Usar siempre código geshi, log de errores, y en lo posible un minimo test de reproduccion del error.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

Cita de: rub'n en 19 Abril 2021, 13:21 PM
dog, create otro metodo con la anotacion @PutMapping para exponer tu endpoint de manera sincrona con RestTemplate, ella actua en otra capa de abstraccion sin tocar el low level api con HttpURLConnection a mano...

Para consumirla usa un cliente estilo HttpClient de Java 11 que es ahora nativo, OKHttpClient, retrofit etc. y te ahorras mas dolor de cabeza, mas facil de depurar etc.


OK lo intentare cualquier cosa la comento.
gracias.

ryhuso

Lo solucione usando un HttpRequest en lugar de HttpURl conection :laugh: