Crear evento de Facebook con una imagen a través de Spring social
-
27-10-2019 - |
Pregunta
Al revisar la API social de Facebook de primavera, EventOperations ofrece
createEvent(java.lang.String name, java.lang.String startTime,
java.lang.String endTime)
para publicar eventos en Facebook.
¿Hay alguna forma de publicar más información sobre el evento, como la imagen y la descripción del evento?
Solución
Mirando a createEvent
método, actualmente no admite el archivo adjunto (imagen del evento).Sin embargo, llama a GraphApi publish
para publicar realmente el evento:
public String createEvent(String name, String startTime, String endTime) {
requireAuthorization();
MultiValueMap<String, Object> data = new LinkedMultiValueMap<String, Object>();
data.set("name", name);
data.set("start_time", startTime);
data.set("end_time", endTime);
return graphApi.publish("me", "events", data);
}
graphApi
.publish(...) en sí (que se implementa en Plantilla de Facebook ) apoyaría cualquier cosa como un par {clave,valor} que Facebook está listo para aceptar, ya que simplemente delega en RestTemplate y envía todos los pares {clave,valor} a Facebook a través de una POST HTTP normal:
public String publish(String objectId, String connectionType, MultiValueMap<String, Object> data) {
MultiValueMap<String, Object> requestData = new LinkedMultiValueMap<String, Object>(data);
URI uri = URIBuilder.fromUri(GRAPH_API_URL + objectId + "/" + connectionType).build();
Map<String, Object> response = getRestTemplate().postForObject(uri, requestData, Map.class);
return (String) response.get("id");
}
Por lo tanto se puede extender el Plantilla de evento y agrega otro createEvent
método, eso tomaría un image name
y un image file path
, y lo agregaría como una {clave,valor} adicional a un data
Mapa múltiple:
data.set( "@" + imageName, "@" + imagePath )
Por lo tanto, el método se parecería a:
public String createEvent( String name,
String startTime,
String endTime,
String imageName,
String imagePath ) { // or maybe even "File image", where you would derive the path
requireAuthorization();
MultiValueMap<String, Object> data = new LinkedMultiValueMap<String, Object>();
data.set("name", name);
data.set("start_time", startTime);
data.set("end_time", endTime);
data.set( "@" + imageName, "@" + imagePath ); // <<< adding this line
return graphApi.publish("me", "events", data);
}
Por supuesto, esto no incluye ninguna posible validación que desee realizar, etc.Una vez que tengas esto funcionando, lo cual parece bastante sencillo, puedes donarlo/contribuirlo nuevamente a Spring Social => estarían muy contentos :)
Otros consejos
Aunque la respuesta proporcionada era posiblemente correcta en ese momento, hoy en día esta respuesta es engañosa y incorrecta.Desde v2.1 en adelante, no puede hacer CREAR / ACTUALIZAR / ELIMINAR de eventos a través de API.
https://developers.facebook.com/docs/graph-api/reference/v2.1/event/