Dans ce tutoriel, nous allons couvrir comment implémenter l’approche asynchrone de Image Converter. Il vous suffit d’envoyer l’image source à SubmitWebPConversionTask ou à toute autre méthode d’API de soumission telle que SubmitBmpConversionTask, SubmitDicomConversionTask, etc. pour recevoir l’identificateur de tâche en réponse.

Après avoir reçu l’identificateur de tâche, vous devez vérifier l’état de la tâche en appelant la méthode GetConversionTaskStatus. Vous devez appeler la même méthode après quelques secondes de retard tant que l’état de la tâche est égal à « Waiting ». Une fois que vous avez reçu « Completed » de la méthode GetConversionTaskStatus, vous pouvez appeler la méthode DownloadResult pour télécharger l’image finale. Nous avons utilisé les bibliothèques client HTTP Apache dans ce didacticiel. Vous pouvez ajouter des dépendances ci-dessous dans votre fichier pom.xml.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpclient</artifactId>
     <version>4.5.13</version>
</dependency>

<dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpmime</artifactId>
     <version>4.5.13</version>
</dependency>

<dependency>
     <groupId>commons-io</groupId>
     <artifactId>commons-io</artifactId>
     <version>2.11.0</version>
</dependency>

Vous pouvez utiliser l’implémentation Java ci-dessous.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class ImageConverter {
    private static String submitWebPConversionTask(CloseableHttpClient httpClient, String filePathToConvert, String rapidApiKey) throws IOException {
        File fileToConvert = new File(filePathToConvert);
        HttpPost submitPDFConversionTaskPost = new HttpPost("https://image-converter4.p.rapidapi.com/submitWebPConversionTask");
        submitPDFConversionTaskPost.addHeader("X-RapidAPI-Key", rapidApiKey);
        byte[] bytes = FileUtils.readFileToByteArray(fileToConvert);

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        builder.addBinaryBody("file", bytes, ContentType.DEFAULT_BINARY, fileToConvert.getName());
        builder.addTextBody("lossy", "true", ContentType.TEXT_PLAIN);

        HttpEntity requestEntity = builder.build();
        submitPDFConversionTaskPost.setEntity(requestEntity);
        HttpResponse response = httpClient.execute(submitPDFConversionTaskPost);
        if (response.getStatusLine().getStatusCode() != 200) {
            throw  new IOException("Cannot post conversion task");
        }

        HttpEntity responseEntity = response.getEntity();
        return EntityUtils.toString(responseEntity, "UTF-8");
    }

    private static String getConversionTaskStatus(CloseableHttpClient httpClient, String taskId, String rapidApiKey) throws IOException {
        HttpGet getConversionTaskStatus = new HttpGet("https://image-converter4.p.rapidapi.com/getConversionTaskStatus?taskId=" + taskId);
        getConversionTaskStatus.addHeader("X-RapidAPI-Key", rapidApiKey);

        HttpResponse response = httpClient.execute(getConversionTaskStatus);
        if (response.getStatusLine().getStatusCode() != 200) {
            throw  new IOException("Cannot get conversion task status");
        }

        HttpEntity responseEntity = response.getEntity();
        return EntityUtils.toString(responseEntity, "UTF-8");
    }

    private static byte[] downloadResult(CloseableHttpClient httpClient, String taskId, String rapidApiKey) throws IOException {
        HttpGet downloadResult = new HttpGet("https://image-converter4.p.rapidapi.com/downloadResult?taskId=" + taskId);
        downloadResult.addHeader("X-RapidAPI-Key", rapidApiKey);

        HttpResponse response = httpClient.execute(downloadResult);
        if (response.getStatusLine().getStatusCode() != 200) {
            throw  new IOException("Cannot get converted file");
        }

        HttpEntity responseEntity = response.getEntity();
        return EntityUtils.toByteArray(responseEntity);
    }

    public static void main(String[] args) throws Exception {
        String rapidApiKey = "<YOUR RAPIDAPI KEY HERE>";
        String filePathToConvert = "<IMAGE PATH TO CONVERT>";

        CloseableHttpClient httpClient = HttpClients.createDefault();
        String taskId = submitWebPConversionTask(httpClient, filePathToConvert, rapidApiKey);
        int retryCount = 0;
        while (retryCount < 100)
        {
            retryCount++;
            Thread.sleep(5000);
            String status = getConversionTaskStatus(httpClient, taskId, rapidApiKey);
            if (status.equals("Completed"))
            {
                byte[] fileBytes = downloadResult(httpClient, taskId, rapidApiKey);
                File outputFile =new File("final_image.webp");
                Files.write(outputFile.toPath(), fileBytes);
                break;
            }
            else if (status.equals("Waiting"))
            {
                continue;
            }
            else if (status.equals("Failed"))
            {
                throw new Exception("Cannot convert image");
            }
            else
            {
                throw new Exception("Invalid status");
            }
        }
    }
}