L'exemple ci-dessous utilise cURL pour télécharger le fichier image inclus en tant que fichier binaire.
URL image_url = Thread.currentThread().getContextClassLoader().getResource("jobs_image.jpg"); String path = image_url.getFile(); HttpResponse<String> response = Unirest.post(uploadUrl) .header("cache-control", "no-cache") .header("X-Restli-Protocol-Version", "2.0.0") .header("Authorization", "Bearer " + token + "") .field("file", new File(path)) .asString();
Cela fonctionne très bien. Je dois faire cette demande depuis mon application Java.
J'ai essayé le code suivant
curl -i --upload-file /path/to/image.png --header "Authorization: Token" 'https://url....'
Cependant, il renvoie le statut 400 Bad Request. Existe-t-il un moyen d'appeler une telle demande depuis Java?
Ceci est une demande de l'API LinkedIn v2: https://docs.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/share-on-linkedin?context=linkedin/consumer/context#upload-image- fichier binaire
3 Réponses :
Je pense que la commande curl
curl -i --upload-file /path/to/image.png --header "Authorization: Token" 'https: // url ....'
utilise PUT
pendant que votre client Java utilise POST
Source: La page de manuel de curl
.
-T, --upload-file <file> This transfers the specified local file to the remote URL. If there is no file part in the specified URL, Curl will append the local file name. NOTE that you must use a trailing / on the last directory to really prove to Curl that there is no file name or curl will think that your last directory name is the remote file name to use. That will most likely cause the upload operation to fail. If this is used on an HTTP(S) server, the PUT command will be used.
J'ai essayé les méthodes POST et PUT. Je pense que le problème réside dans la mauvaise structure de ma demande.
J'ai le même problème de demande incorrecte lors de la demande de téléchargement d'image en utilisant php curl. Mais quand je fais la requête curl -i --upload-file à partir de la ligne de commande, cela fonctionne bien. Toujours à la recherche d'une réponse. Avez-vous trouvé le moyen d'effectuer un téléchargement?
Consultez ma réponse ci-dessous. Je n'utilise ni PHP ni Java, mais je pense que le problème est le même pour tous les langages. Vous devez transmettre le type MIME de l'image comme Content-Type dans les en-têtes de la demande.
Après plusieurs heures passées à me cogner la tête contre le mur, j'ai enfin trouvé comment convertir l'appel curl en un RestClient one (j'utilise Ruby on Rails).
Je pense que le problème que vous rencontrez est que vous devez passer le type MIME comme Content-Type dans les en-têtes de la requête.
J'utilise MiniMagick pour déterminer le type MIME de l'image I je télécharge sur LinkedIn. MiniMagick peut également vous donner la chaîne binaire de l'image requise par LinkedIn, c'est donc une situation gagnant-gagnant.
C'est l'appel qui a finalement fonctionné:
file = MiniMagick::Image.open(FILE_PATH) RestClient.post(UPLOAD_URL, file.to_blob, { 'Authorization': 'Bearer TOKEN', 'Content-Type': file.mime_type })
La méthode ci-dessous téléchargera l'image sur linkedIn
private void uploadMedia(String uploadUrl,String accessToken) throws IOException { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.add("Authorization","Bearer "+accessToken); byte[] fileContents = Files.readAllBytes(new File("path_to_local_file").toPath()); HttpEntity<byte[]> entity = new HttpEntity<>(fileContents, headers); restTemplate.exchange(uploadUrl,HttpMethod.PUT, entity, String.class); }
Vote positif! J'ai eu le même problème lors de la conversion de cet appel en Ruby's Rest Client, mais j'ai trouvé un autre problème (déjà résolu). Je n'ai pas encore eu la chance de revenir sur celui-ci. stackoverflow.com/questions/54201879/...
J'ai eu le même problème, vous pouvez voir ma solution ici: stackoverflow.com/questions/54932485/...