4
votes

Comment convertir un appel curl avec "-i --upload-file" en java Unirest ou toute autre requête http?

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


2 commentaires

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


3 Réponses :


0
votes

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.


3 commentaires

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.



2
votes

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 })


0 commentaires

1
votes

La méthode ci-dessous téléchargera l'image sur linkedIn

Référence: https://docs.microsoft.com/en-us/linkedin/marketing/integrations/community-management/shares/vector-asset-api#upload- l'image

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);
      }


0 commentaires