في هذا البرنامج التعليمي ، سنغطي كيفية تنفيذ نهج غير متزامن لتحويل الصور. تحتاج فقط إلى إرسال صورة المصدر إلى SubmitWebPConversionTask أو أي طرق أخرى لواجهة برمجة تطبيقات الإرسال مثل SubmitBmpConversionTask، SubmitDicomConversionTask وما إلى ذلك لتلقي معرف المهمة كاستجابة.

بعد تلقي معرف المهمة ، تحتاج إلى التحقق من حالة المهمة عن طريق الاتصال بطريقة GetConversionTaskStatus. تحتاج إلى استدعاء نفس الطريقة بعد تأخير بضع ثوان طالما أن حالة المهمة تساوي “Waiting”. بمجرد تلقي “Completed” من طريقة GetConversionTaskStatus ، يمكنك الاتصال بطريقة DownloadResult لتنزيل الصورة النهائية. لقد استخدمنا مكتبات عميل Apache HTTP في هذا البرنامج التعليمي. يمكنك إضافة تبعيات أدناه في ملف 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>

يمكنك استخدام تطبيق Java أدناه.

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