Estoy atascado al llamar a la API de mutación de graphQL en Spring Boot. Permítanme explicar mi escenario, tengo dos microservicios, uno es AuditConsumeService que consume el mensaje de ActiveMQ y el otro es la capa GraphQL que simplemente toma los datos del servicio de consumo y los coloca dentro de la base de datos. Todo bien cuando trato de enviar datos usando graphql playground o postman. ¿Cómo envío datos desde AuditConsumeService. En AuditConsumeService, intento enviar la API de mutación como una cadena. el método que es responsable de enviar eso a la capa graphQL es
public Mono<String> sendLogsToGraphQL(String logs){ return webClient .post() .uri("http://localhost:8080/logs/createEventLog") .bodyValue(logs) .retrieve() .bodyToMono(String.class); } NOTA: También trato de pasar datos como Objeto, pero no sirve. Los String logs se le proporcionarán desde activeMQ. Los datos que estoy enviando son;
{ "hasError": false, "message": "Hello There", "sender": "Ali Ahmad", "payload": { "type": "String", "title": "Topoic", "description": "This is the demo description of the activemqq" }, "serviceInfo":{ "version": "v1", "date": "2021-05-18T08:44:17.8237608+05:00", "serverStatus": "UP", "serviceName": "IdentityService" } }La mutación será como;
mutation($eventLog:EventLogInput){ createEventLog(eventLog: $eventLog){ hasError message payload{ title, description } } } $eventLog tiene cuerpo json como;
{ "eventLog": { "hasError": false, "message": "Hello There", "sender": "Ali Ahmad", "payload": { "type": "String", "title": "Topoic", "description": "This is the demo description of the activemqq" }, "serviceInfo":{ "version": "v1", "date": "2021-05-18T08:44:17.8237608+05:00", "serverStatus": "UP", "serviceName": "IdentityService" } } }EDITAR Siga la respuesta a continuación, actualizando el servicio al consumidor como;
@Component public class Consumer { @Autowired private AuditService auditService; private final String MUTATION_QUERY = "mutation($eventLog: EventLogInput){\n" + "createEventLog(eventLog: $eventLog){\n" + "hasError\n" + "}\n" + "}"; @JmsListener(destination = "Audit.queue") public void consumeLogs(String logs) { Gson gson = new Gson(); Object jsonObject = gson.fromJson(logs, Object.class); Map<String, Object> graphQlBody = new HashMap<>(); graphQlBody.put("query", MUTATION_QUERY); graphQlBody.put("variables", "{eventLog: " + jsonObject+ "}"); auditService.sendLogsToGraphQL(graphQlBody); } }Ahora se convierte en `sendLogsToGraphQL'.
public void sendLogsToGraphQL(Map<String, String> logs) { log.info("Logs: {} ", logs); Mono<String> stringMono = webClient .post() .uri("http://localhost:8080/graphql") .bodyValue(BodyInserters.fromValue(logs)) .retrieve() .bodyToMono(String.class); log.info("StringMono: {}", stringMono); return stringMono; }Los datos no se envían a la capa de graphql con la URL especificada.
Debe enviar la query y el cuerpo como variables en la solicitud posterior como se muestra aquí
graphQlBody = { "query" : mutation_query, "variables" : { "eventLog" : event_log_json } }Y luego en webClient puede enviar el cuerpo de varias maneras
public Mono<String> sendLogsToGraphQL(Map<String,Object> body){ return webClient .post() .uri("http://localhost:8080/logs/createEventLog") .bodyValue(BodyInserters.fromValue(body)) .retrieve() .bodyToMono(String.class); } Aquí acabo de mostrar el uso de Map<String,Object> para formar el cuerpo de solicitud de graphQL, pero también puede crear clases POJO correspondientes con las propiedades de query y variables