Télécharger une photo Facebook avec HttpClient
-
11-10-2019 - |
Question
Je tente d'utiliser le code suivant pour télécharger une photo à Facebook en utilisant l'API Graph. Je continue à obtenir « Bad Request » mais ne sais pas pourquoi. Je peux télécharger la photo très bien en utilisant boucle avec les mêmes paramètres. J'utilise Java avec HttpClient.
PostMethod filePost = new PostMethod('https://graph.facebook.com/me/photos');
filePost.setParameter('access_token', 'my-access-token')
filePost.setParameter('message', 'test image')
filePost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, false);
try {
println("Uploading " + file.getName() + " to 'https://graph.facebook.com/me/photos'");
Part[] parts = [new FilePart('source', file.getName(), file)]
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if (status == HttpStatus.SC_OK) {
println(
"Upload complete, response=" + filePost.getResponseBodyAsString()
);
} else {
println(
"Upload failed, response=" + HttpStatus.getStatusText(status)
);
}
} catch (Exception ex) {
println("ERROR: " + ex.getClass().getName() + " " + ex.getMessage());
ex.printStackTrace();
} finally {
filePost.releaseConnection();
}
MISE À JOUR: Plus à ce sujet. Je pris un peu plus d'informations sur la réponse et je reçois ceci:
{ "erreur": { "type": "OAuthException", "message": "Un jeton d'accès actif doit être utilisé pour demander des informations sur l'utilisateur actuel"}}
Mais cela ne semble pas juste que j'utilise jeton d'accès que Facebook donne de nouveau à moi après le processus authorize.
Code boucle de travail:
curl -F 'access_token=my-access-token' -F 'source=@/path/to/image.jpg' -F 'message=Some caption' https://graph.facebook.com/me/photos
La solution
Je résolu le problème. Au lieu d'ajouter les params au PostMethod, je devais ajouter le access_token et le message au tableau partie []. Code complet:
PostMethod filePost = new PostMethod('https://graph.facebook.com/me/photos');
filePost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, false);
try {
println("Uploading " + file.getName() + " to 'https://graph.facebook.com/me/photos'");
Part[] parts = [new FilePart('source', file.getName(), file), new StringPart('access_token', "${facebookData.access_token}"), new StringPart('message', 'some message')]
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if (status == HttpStatus.SC_OK) {
println("Upload complete, response=" + filePost.getResponseBodyAsString());
} else {
println("Upload failed, response=" + HttpStatus.getStatusText(status));
// Create response
StringBuilder notificationsSendResponse = new StringBuilder();
byte[] byteArrayNotifications = new byte[4096];
for (int n; (n = filePost.getResponseBodyAsStream().read(byteArrayNotifications)) != -1;) {
notificationsSendResponse.append(new String(byteArrayNotifications, 0, n));
}
String notificationInfo = notificationsSendResponse.toString();
}
} catch (Exception ex) {
println("ERROR: " + ex.getClass().getName() + " " + ex.getMessage());
ex.printStackTrace();
} finally {
filePost.releaseConnection();
}
Autres conseils
Vous pouvez utiliser l'api socialauth java pour l'image de téléchargement par l'application Web.
est la version Android de la méthode
private void postOnFacebook() {
try {
HttpPost httpPost = new HttpPost("https://graph.facebook.com/me/photos");
MultipartEntity entity = new MultipartEntity();
String base64Image = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3gro4KMKOPLqAAAq/UdZuRmLacAAAAASUVORK5CYII=";
byte[] imageData = Base64.decode(base64Image, 0);
entity.addPart("access_token", new StringBody("your access token"));
entity.addPart("message", new StringBody("test msg"));
entity.addPart("source", new ByteArrayBody(imageData, "test"));
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
httpPost.getParams().setBooleanParameter(USE_EXPECT_CONTINUE, false);
httpPost.setEntity(entity);
HttpResponse resp = httpclient.execute(httpPost);
HttpEntity entity2 = resp.getEntity();
if (entity != null) {
String responseBody = EntityUtils.toString(entity2);
responseBody.toString();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}