Foro de elhacker.net

Programación => Java => Mensaje iniciado por: ryhuso en 19 Abril 2021, 12:31 pm



Título: peticion http desde spring
Publicado por: ryhuso en 19 Abril 2021, 12:31 pm
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.
Código:

@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.





Título: Re: peticion http desde spring
Publicado por: 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.


Título: Re: peticion http desde spring
Publicado por: 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.


Título: Re: peticion http desde spring
Publicado por: ryhuso en 19 Abril 2021, 12:56 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


Título: Re: peticion http desde spring
Publicado por: rub'n en 19 Abril 2021, 12:56 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()


Título: Re: peticion http desde spring
Publicado por: ryhuso en 19 Abril 2021, 13:05 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.


Título: Re: peticion http desde spring
Publicado por: ryhuso en 19 Abril 2021, 13:08 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


Título: Re: peticion http desde spring
Publicado por: rub'n en 19 Abril 2021, 13:21 pm
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.


Título: Re: peticion http desde spring
Publicado por: ryhuso en 19 Abril 2021, 13:24 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.


Título: Re: peticion http desde spring
Publicado por: ryhuso en 19 Abril 2021, 13:36 pm
Lo solucione usando un HttpRequest en lugar de HttpURl conection :laugh:


Título: Re: peticion http desde spring
Publicado por: rub'n en 19 Abril 2021, 13:42 pm
Lo solucione usando un HttpRequest en lugar de HttpURl conection :laugh:

No te emociones tanto, si alguien tiene que gobernar tu API asi como la tienes no pasas, no cumples ciertos principios, cada operacion debe ser especifica para una sola cosa.

Un post en un metodo, y para otros igual. etc...

Que te funciono no implica nada.