في هذا البرنامج التعليمي ، سنغطي كيفية تنفيذ نهج غير متزامن لعارض الويب. ما عليك سوى إرسال محتوى HTML إلى طرق واجهة برمجة تطبيقات SubmitPDFFromHTMLTask أو SubmitImageFromHTMLTask لتلقي معرف المهمة كاستجابة. هناك أيضا طرق SubmitPDFFromUrlTask و SubmitImageFromUrlTask لعرض PDF أو Image من عنوان URL العام على الويب.

بعد تلقي معرف المهمة ، تحتاج إلى التحقق من حالة المهمة عن طريق الاتصال بطريقة GetRenderingTaskStatus. تحتاج إلى استدعاء نفس الطريقة بعد تأخير بضع ثوان طالما أن حالة المهمة تساوي “Waiting”. بمجرد تلقي “Completed” من طريقة GetRenderingTaskStatus ، يمكنك الاتصال بطريقة 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
100
101
102
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 WebRenderer {
    private static String submitPDFFromHTMLTask(CloseableHttpClient httpClient, String htmlContent, String uri, String rapidApiKey) throws IOException {
        HttpPost submitPDFFromHTMLTaskPost = new HttpPost("https://web-renderer.p.rapidapi.com/SubmitPDFFromHTMLTask");
        submitPDFFromHTMLTaskPost.addHeader("X-RapidAPI-Key", rapidApiKey);

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        builder.addTextBody("uri", uri, ContentType.TEXT_PLAIN);
        builder.addTextBody("useCompression", "false", ContentType.TEXT_PLAIN);
        builder.addTextBody("pageLabel", "Home Page", ContentType.TEXT_PLAIN);
        builder.addTextBody("messageLabel", "Initial Capture", ContentType.TEXT_PLAIN);
        builder.addTextBody("browserHeight", "768", ContentType.TEXT_PLAIN);
        builder.addTextBody("browserWidth", "1024", ContentType.TEXT_PLAIN);
        builder.addTextBody("htmlContent", htmlContent, ContentType.TEXT_PLAIN);

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

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

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

        HttpResponse response = httpClient.execute(getConversionTaskStatus);
        if (response.getStatusLine().getStatusCode() != 200) {
            throw  new IOException("Cannot get rendering 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://web-renderer.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 rendered file");
        }

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

    public static void main(String[] args) throws Exception {
        String rapidApiKey = "<YOUR RAPID API KEY HERE>";
        String htmlContent = "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"></head><body><h1>Hello World!</h1></body></html>";
        String uriOfHtmlContent = "https://www.google.com?hl=en";

        CloseableHttpClient httpClient = HttpClients.createDefault();
        String taskId = submitPDFFromHTMLTask(httpClient, htmlContent, uriOfHtmlContent, rapidApiKey);
        int retryCount = 0;
        while (retryCount < 100)
        {
            retryCount++;
            Thread.sleep(5000);
            String status = getRenderingTaskStatus(httpClient, taskId, rapidApiKey);
            if (status.equals("Completed"))
            {
                byte[] fileBytes = downloadResult(httpClient, taskId, rapidApiKey);
                File outputFile =new File("html_from_html.pdf");
                Files.write(outputFile.toPath(), fileBytes);
                break;
            }
            else if (status.equals("Waiting"))
            {
                continue;
            }
            else if (status.equals("Failed"))
            {
                throw new Exception("Cannot rendered file");
            }
            else
            {
                throw new Exception("Invalid status");
            }
        }
    }
}