GET /api/v0/PrintQueue/{operationId}/result – pobierz gotowy wydruk w formacie Bytes

Opis mechanizmu

Endpoint służy do pobierania gotowego, wyrenderowanego dokumentu w postaci strumienia pliku binarnego, po tym jak zadanie asynchroniczne osiągnęło w kolejce status końcowy „Succeeded”.

Uwaga
Ważne! Pobranie pliku za pomocą tego endpointu jest możliwe wyłącznie wtedy, gdy pierwotne żądanie (POST /enqueue) definiowało format wyjściowy jako strumień bajtów, czyli posiadało konfigurację "output": { "dataFormat": "Bytes" }W przypadku, gdy wydruk konfigurowano na bezpośredni zapis dyskowy (Path) lub chmurowy (S3), dokument został automatycznie odłożony w tamtych lokalizacjach przez proces tła, a wywołanie tego endpointu zwróci kod błędu 404.
  • Wersja: v0
  • Metoda HTTP: GET
  • Format danych: Zależny od wyjściowego pliku (Binary Stream)

Szkielet żądania (Request URI)

Pobranie pliku realizowane jest poprzez dedykowane żądanie typu GET:

GET /api/v0/PrintQueue/{operationId}/result HTTP/1.1
Host: localhost:5000
Accept: */*

Parametry ścieżki (Path Parameters)

  • {operationId} (string / GUID): Wymagany. Umieszczany bezpośrednio w ścieżce adresu URL. Jest to unikalny identyfikator powiązany z plikiem wynikowym operacji wydruku (GUID przekazany przez Twój system w payloadzie wejściowym podczas zlecania zadania metodą POST /enqueue).

 


Pełny cykl życia operacji asynchronicznej (Krok po kroku)

Zrozumienie poniższej ścieżki jest kluczowe dla dewelopera: do odpytywania o status zadania używamy identyfikatora jobId, natomiast do końcowego odebrania pliku binarnego wymagany jest identyfikator operationId.

Krok 1: Zlecenie zadania do kolejki (opis /api/v0/PrintQueue/enqueue)

POST /api/v0/PrintQueue/enqueue HTTP/1.1
Content-Type: application/json

{
  "operationId": "my-report-123",
  "printFormat": "Pdf",
  "report": {
    "source": "SGVsbG8gd29ybGQh",
    "dataFormat": "Bytes"
  },
  "output": {
    "dataFormat": "Bytes"
  }
}

Odpowiedź serwera (HTTP 202 Accepted):

{
  "jobId": "job-12345",
  "operationId": "my-report-123"
}

Krok 2: Sprawdzenie statusu przetwarzania w tle (opis /api/v0/PrintQueue/{jobId}/status)

Odpytujemy system za pomocą otrzymanego parametru jobId:

GET /api/v0/PrintQueue/job-12345/status HTTP/1.1

Odpowiedź serwera (HTTP 200 OK):

{
  "status": "Succeeded"
}

Krok 3: Pobranie gotowego pliku wynikowego

Gdy status zmieni się na „Succeeded”, pobieramy dokument za pomocą opisywanego w tym artykule /api/v0/PrintQueue/{operationId}/result, wskazując w ścieżce jego operationId:

GET /api/v0/PrintQueue/my-report-123/result HTTP/1.1
Accept: */*

Odpowiedź serwera (HTTP 200 OK): Surowy pobierany plik PDF (Binary file download).



Kody odpowiedzi (Responses)

? HTTP 200 OK

Serwer pomyślnie zweryfikował ukończenie zadania i zwraca wygenerowany dokument jako binarny strumień danych przeznaczony do bezpośredniego pobrania (File Download). Nagłówek odpowiedzi: Content-Type jest automatycznie dopasowywany przez silnik do formatu wybranego w parametrze wejściowym printFormat żądania:

  • Dla formatu PDF: application/pdf
  • Dla formatów Excel (XLSX): application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • Dla formatów Word (DOCX): application/vnd.openxmlformats-officedocument.wordprocessingml.document

Format odpowiedzi:
Surowy plik binarny (Strumień bajtów dokumentu pdf/xlsx/doc)

Uwaga
Uwaga! Po otrzymaniu statusu HTTP 200 OK otrzymujemy gotowy dokument w formie strumienia bajtów, wraz z pobraniem dokumentu również zostaje on usunięty ze Storage, który przetrzymuje je do czasu wykonania endpointu (GET /api/v0/PrintQueue/{operationId}/result), a więc pobranie jest możliwe tylko jeden raz, przy kolejnym wykonaniu takiego samego requestu na operationId otrzymamy błąd, ponieważ został on usunięty.

? HTTP 404 Not Found

Zwracany w sytuacji, gdy przekazany identyfikator operationId nie istnieje w rejestrze, zadanie powiązane z operacją wciąż się przetwasza (nie osiągnęło jeszcze statusu Succeeded) bądź pierwotna konfiguracja wyjściowa (output) zakładała bezpośredni zapis pliku na serwerze lub chmurze S3 zamiast buforowania w pamięci bazy danych API.

Format odpowiedzi: application/json (string)


Realne Przykłady Implementacji (Odbiór i Zapis Strumienia)

W przypadku poprawnego wywołania (status 200 OK), serwer nie zwraca struktury tekstowej JSON, lecz surową zawartość binarną pliku, którą aplikacja kliencka musi odebrać jako tablicę bajtów i zapisać fizycznie na dysku lokalnym.

1. Przykład w języku Python ( requests )

import requests

operation_id = "f7b6058c-6878-433b-bf72-a0e28f32371a"
url = f"http://localhost:5000/api/v0/PrintQueue/{operation_id}/result"

response = requests.get(url, headers={"Accept": "*/*"})

if response.status_code == 200:
    print(f"Wykryto format pliku z nagłówka Content-Type: {response.headers.get('Content-Type')}")
    
    # Zapis surowego binarnego strumienia bajtów (content) na dysk lokalny klienta
    with open("PobranaEtykieta.pdf", "wb") as file:
        file.write(response.content)
    print("Pomyślnie pobrano i zapisano dokument jako PobranaEtykieta.pdf")
elif response.status_code == 404:
    print("Dokument nie istnieje, wciąż się renderuje lub został zapisany w trybie Path/S3.")

2. Przykład w języku C# ( HttpClient )

using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var operationId = "f7b6058c-6878-433b-bf72-a0e28f32371a";
        var url = $"http://localhost:5000/api/v0/PrintQueue/{operationId}/result";

        using var client = new HttpClient();
        
        try
        {
            var response = await client.GetAsync(url);

            if (response.IsSuccessStatusCode)
            {
                // Odczytujemy odpowiedź jako tablicę bajtów
                byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();
                
                // Asynchroniczny zapis strumienia binarnego na dysk klienta
                await File.WriteAllBytesAsync("PobranaEtykieta.pdf", fileBytes);
                Console.WriteLine("Pomyślnie zapisano plik z kolejki sPrint.");
            }
            else if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
            {
                Console.WriteLine("Błąd 404: Brak raportu w pamięci bazy danych (prawdopodobnie tryb Path/S3 lub w toku).");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Błąd sieciowy podczas komunikacji z API: {ex.Message}");
        }
    }
}

Czy ten artykuł był pomocny?