Opcje przesyłania
Interfejs Android Over The Air API umożliwia przesyłanie danych pakietu w celu utworzenia nowego zasobu pakietu. Są to Pakiety OTA, które można powiązać z co najmniej 1 konfiguracją, aby dostarczyć aktualizację. do urządzeń.
Udostępniamy plik binarny dla systemów Linux i Windows, aby ułatwić wznawianie przesyłania pakietów są bezpłatne i nie trzeba stosować opisanych poniżej protokołów. Jeśli chcesz wiedzieć więcej należy użyć jednego z protokołów opisanych poniżej.
Linux
Pobierz klienta interfejsu Android Over The Air API w wersji 1 do przesyłania dla systemu Linux.
Windows
Aby z niego korzystać, musisz najpierw utworzyć konto usługi i uzyskać dla niego plik klucza JSON.
Tutaj znajdziesz przewodnik po tworzeniu konta.
Plik binarny i plik klucza możesz uruchomić, używając opcji wiersza poleceń, aby określić
plik z kluczem, wdrożenie i przesyłany pakiet. Użyj konta --help
aby zobaczyć wszystkie opcje.
Protokoły przesyłania
Prośby o przesłanie możesz przesłać na dowolny z poniższych sposobów.
W nagłówku żądania X-Goog-Upload-Protocol określ używaną metodę.
- Przesyłanie wieloczęściowe:
X-Goog-Upload-Protocol: multipart. Aby szybko przenieść mniejsze pliki i metadane, przesyła plik wraz z opisującymi go metadanymi, a wszystko to w ramach jednego żądania. - Przesyłanie z możliwością wznowienia:
X-Goog-Upload-Protocol: resumable. Niezawodne przesyłanie danych, szczególnie w przypadku większych . Ta metoda wykorzystuje żądanie inicjujące sesję, które może opcjonalnie zawierać metadane. Strategia ta jest przydatna dla większości aplikacji, bo pozwala to też na obsługę mniejszych plików, co wymaga opłaty za jedno dodatkowe żądanie HTTP przy każdym przesłaniu.
Przesyłanie wieloczęściowe
Jest to dobry wybór, jeśli przesyłane dane są małe tyle, aby przesłać je w całości w przypadku braku połączenia.
Aby użyć przesyłania wieloczęściowego, wyślij żądanie POST do pliku /upload/package
Identyfikator URI i ustaw X-Goog-Upload-Protocol na multipart.
Nagłówki HTTP najwyższego poziomu, których należy użyć w przypadku wysyłania wieloczęściowego żądania przesyłania, to między innymi:
Content-TypeUstaw jako wieloczęściową/powiązaną i uwzględnij ciąg granicy, w której za pomocą której można zidentyfikować te części żądania.Content-LengthUstaw łączną liczbę bajtów w treści żądania.
Treść żądania jest sformatowana jako treść multipart/related
typu [RFC2387] i zawiera dokładnie 2 części.
Części są oznaczone ciągiem znaków granicy, a po nim końcowym – 2 łączniki.
Każda część żądania wieloczęściowego wymaga dodatkowego nagłówka Content-Type:
- Część metadanych: wartość musi być pierwsza, a pole
Content-Typemusi mieć wartośćapplication/json. - Część multimediów: musi być druga, a
Content-Typemusi mieć wartośćapplication/zip.
Przykład: przesyłanie wieloczęściowe
Przykład poniżej przedstawia wieloczęściowe żądanie przesłania danych przez interfejs Android Over The Air API.
POST /upload/package HTTP/1.1 Host: androidovertheair.googleapis.com Authorization: Bearer your_auth_token Content-Type: multipart/related; boundary=BOUNDARY Content-Length: number_of_bytes_in_entire_request_body --BOUNDARY Content-Type: application/json; charset=UTF-8 {"deployment": "id", "package_title": "title" } --BOUNDARY Content-Type: application/zip; charset=UTF-8 Package ZIP --BOUNDARY--
Jeśli żądanie zostanie zrealizowane, serwer zwróci kod stanu HTTP 200 OK
HTTP/1.1 200
Aby to łatwo zrobić, użyj polecenia curl i oauth2l. Poniżej znajduje się przykładowe żądanie , który zakłada, że używasz klucza usługi (zobacz jak uzyskać autoryzację).
Przykładowe żądanie curl
JSON={"deployment": "id", "package_title": "title" } SERVICE_KEY_FILE=path to your service key json file curl \ -H "$(./oauth2l header --json $SERVICE_KEY_FILE android_partner_over_the_air)" \ -H "Host: androidovertheair.googleapis.com" \ -H "X-Goog-Upload-Protocol: multipart" \ -H "Content-Type: multipart/form-data" \ -F "json=$JSON;type=application/json" \ -F "data=@update.zip;type=application/zip" \ androidovertheair.googleapis.com/upload/package
Przesyłanie z możliwością wznowienia
Aby zwiększyć niezawodność przesyłania plików danych, możesz użyć protokołu przesyłania z możliwością wznawiania. Protokół ten umożliwia wznowienie operacji przesyłania po przerwaniu przepływu danych przez błąd komunikacji. it jest szczególnie przydatna, gdy przesyłasz duże pliki i istnieje ryzyko przerw w działaniu sieci lub występują inne błędy transmisji, które występują podczas przesyłania, np. z aplikacji klienta mobilnej. it może też zmniejszyć wykorzystanie przepustowości w przypadku awarii sieci, ponieważ nie trzeba przesyłać duże pliki od początku.
Protokół przesyłania z możliwością wznowienia używa kilku poleceń:
- Rozpocznij sesję, którą można wznowić. Wyślij wstępne żądanie do identyfikatora URI przesyłania zawierającego metadanych i ustanawia unikalną lokalizację przesyłania, którą można wznowić.
- Zapisz identyfikator URI sesji, którą można wznawiać. Zapisz identyfikator URI sesji zwrócony w odpowiedź na pierwotne żądanie; Użyjesz go w pozostałych żądaniach w tej sesji.
- Prześlij plik. Wyślij całość lub część pliku ZIP do identyfikatora URI sesji możliwej do wznowienia.
Oprócz tego aplikacje korzystające z funkcji wznawiania przesyłania muszą mieć kod umożliwiający wznawianie przerwanego przesyłania. Jeśli przesyłany film jest aby sprawdzić, ile danych udało się odebrać, i wznowić przesyłanie, zaczynając od tego momentu.
Uwaga: identyfikator URI przesyłania wygasa po 3 dniach.
Krok 1. Rozpocznij sesję, którą można wznowić
Aby rozpocząć przesyłanie, które można wznowić, wyślij żądanie POST do pliku /upload/package.
Identyfikator URI i ustaw X-Goog-Upload-Protocol na resumable.
Treść tego żądania inicjującego musi zawierać tylko metadane. przenosisz rzeczywistość zawartość pliku, który chcesz przesłać w kolejnych żądaniach.
W pierwszym żądaniu HTTP użyj tych nagłówków HTTP:X-Goog-Upload-Header-Content-TypeTo jest typ treści przesyłanego pliku i musi być ustawiony naapplication/zip.X-Goog-Upload-CommandUstaw jakostartX-Goog-Upload-Header-Content-LengthUstaw liczbę bajtów przesyłanych danych, które mają być przeniesione w kolejnych żądaniach. Jeśli długość jest nieznana w momencie wysyłania żądania, możesz pominąć ten nagłówek.Content-TypeJest to typ treści metadanych, który musi być ustawiony naapplication/json.Content-LengthUstaw liczbę bajtów podanych w treści tego początkowego żądania.
Przykład: żądanie zainicjowania sesji z możliwością wznowienia
Z przykładu poniżej dowiesz się, jak rozpocząć sesję wznawianą w przypadku interfejsu Android Over The Air API.
POST /upload/package HTTP/1.1 Host: android/over-the-air.googleapis.com Authorization: Bearer your_auth_token Content-Length: 38 Content-Type: application/json; charset=UTF-8 X-Goog-Upload-Command: start X-Goog-Upload-Header-Content-Type: application/zip X-Goog-Upload-Header-Content-Length: 2000000 {"deployment": "id", "package_title": "title" }
W następnej sekcji dowiesz się, jak postępować z odpowiedzią.
Krok 2. Zapisz identyfikator URI sesji do wznawiania
Jeśli żądanie zainicjowania sesji zostanie zrealizowane, serwer interfejsu API w odpowiedzi przesyła kod stanu HTTP 200 OK.
Oprócz tego zawiera nagłówek X-Goog-Upload-URL, który określa identyfikator URI sesji do wznowienia.
Nagłówek X-Goog-Upload-URL widoczny w przykładzie poniżej zawiera parametr zapytania upload_id
, która określa unikalny identyfikator przesyłania używany w danej sesji. Odpowiedź zawiera też atrybut X-Goog-Upload-Status
nagłówek, czyli active, jeśli żądanie przesyłania było prawidłowe i zaakceptowane. Ten stan może być ustawiony na final
jeśli przesyłanie zostało odrzucone.
Przykład: odpowiedź na zainicjowanie sesji z możliwością wznawiania
Oto odpowiedź na żądanie z kroku 1:
HTTP/1.1 200 OK X-Goog-Upload-Status: active X-Goog-Upload-URL: androidovertheair.googleapis.com/?upload_id=xa298sd_sdlkj2 Content-Length: 0
Wartość nagłówka X-Goog-Upload-URL (pokazana w powyższej przykładowej odpowiedzi) to
identyfikator URI sesji, który będzie używany jako punkt końcowy HTTP do przesyłania rzeczywistego pliku lub wysyłania zapytań o stan przesyłania.
Skopiuj i zapisz identyfikator URI sesji, by móc go używać w kolejnych żądaniach.
Krok 3: prześlij plik
Aby przesłać plik, wyślij żądanie POST pod identyfikator URI przesyłania uzyskany w
poprzedniego kroku. Prośba o przesłanie pliku jest w formacie:
POST session_uri
Nagłówki HTTP używane przy wysyłaniu żądań przesyłania plików z możliwością wznawiania obejmują:
Content-LengthUstaw tę wartość na liczbę bajtów, które chcesz przesłać w ramach tego żądania. Jest to zwykle rozmiar przesyłanego pliku.X-Goog-Upload-CommandUstaw nauploadifinalize.X-Goog-Upload-OffsetOkreślało przesunięcie, od którego należy zapisywać bajty. Pamiętaj, że klienci musi przesyłać bajty po kolei.
Przykład: żądanie wznowienia przesłania pliku
To jest możliwe do wznowienia żądanie przesłania całego pliku ZIP o rozmiarze 2 000 000 bajtów w obecnym przykładzie.
POST /?upload_id=xa298sd_sdlkj2 HTTP/1.1 Host: androidovertheair.googleapis.com X-Goog-Upload-Protocol: resumable X-Goog-Upload-Command: upload, finalize X-Goog-Upload-Offset: 0 Content-Length: 2000000 Content-Type: application/zip bytes 0-1999999
Jeśli żądanie zostanie zrealizowane, serwer zwróci odpowiedź HTTP 200 Ok.
Jeśli żądanie przesyłania zostanie przerwane albo otrzymasz żądanie HTTP 503 Service Unavailable lub inne
innej odpowiedzi 5xx z serwera, wykonaj procedurę opisaną w sekcji Wznów przerwane przesyłanie.
Przesyłanie pliku etapami
Dzięki wznawianiu przesyłania możesz podzielić plik na fragmenty i wysłać serię żądań, aby przesłać każdy fragment po kolei.
Nie jest to preferowane podejście, ponieważ dodatkowe żądania wiążą się z kosztami.
jest zwykle zbędne. Zalecamy, aby klienty przesłały wszystkie pozostałe bajty ładunku
do każdego polecenia upload dodaj polecenie finalize.
Może być jednak konieczne podział na fragmenty, aby zmniejszyć ilość danych przesyłanych w dowolnym tylko jedno żądanie. Pozwala też na przykład wyświetlać wskaźniki postępu przesyłania w starszych przeglądarkach. które domyślnie nie mają obsługi postępu przesyłania.
Wznawianie przerwanego przesyłania
Jeśli żądanie przesyłania zostanie zakończone przed otrzymaniem odpowiedzi lub gdy otrzymasz
odpowiedź HTTP 503 Service Unavailable z serwera, musisz wznowić przerwane przesyłanie. Aby to zrobić:
- Stan żądania. Wysyłanie zapytania do identyfikatora URI przesyłania, aby sprawdzić bieżący stan przesyłania
z polem
X-Goog-Upload-Commandustawionym na wartośćquery.Uwaga: możesz sprawdzać stan poszczególnych fragmentów nie tylko w przypadku przerwania przesyłania. To jest przydatny na przykład wtedy, gdy chcesz wyświetlać informacje o postępie przesyłania w starszych przeglądarkach.
- Sprawdź liczbę przesłanych bajtów. Przetwórz odpowiedź z zapytania o stan. Serwer używa
nagłówek
X-Goog-Upload-Size-Receivedw odpowiedzi z informacją, ile bajtów otrzymał do tej pory. - Prześlij pozostałe dane. Wiesz już, gdzie wznowić prośbę, prześlij
lub bieżący fragment. Pamiętaj, że w obu przypadkach musisz traktować pozostałe dane jako oddzielny fragment, więc
po wznowieniu przesyłania musisz ustawić w nagłówku
X-Goog-Upload-Offsetodpowiednie przesunięcie.
Przykład: wznawianie przerwanego przesyłania
1) Poproś o stan przesyłania.
POST /?upload_id=xa298sd_sdlkj2 HTTP/1.1 Host: androidovertheair.googleapis.com X-Goog-Upload-Command: query
Tak jak w przypadku wszystkich poleceń, klient musi sprawdzić nagłówek X-Goog-Upload-Status w odpowiedzi HTTP polecenia zapytania.
Jeśli nagłówek jest obecny, a wartość nie jest ustawiona na active, przesyłanie zostało już zakończone.
2) Pobierz z odpowiedzi liczbę przesłanych do tej pory bajtów.
W odpowiedzi serwera używany jest nagłówek X-Goog-Upload-Size-Received w celu zasygnalizowania, że
odebrano do tej pory pierwsze 43 bajty pliku.
HTTP/1.1 200 OK X-Goog-Upload-Status: active X-Goog-Upload-Size-Received: 42
3) Wznów przesyłanie od miejsca, w którym zostało przerwane.
Kolejne żądanie wznowi przesyłanie, wysyłając pozostałe bajty pliku, zaczynając od bajtu 43.
POST /?upload_id=xa298sd_sdlkj2 HTTP/1.1 Host: androidovertheair.googleapis.com X-Goog-Upload-Command: upload, finalize Content-Length: 1999957 X-Goog-Upload-Offset: 43 bytes 43-1999999
Sprawdzone metody
Podczas przesyłania multimediów warto pamiętać o kilku sprawdzonych metodach dotyczących obsługi błędów.
- Wznów lub ponów przesyłanie, które nie powiodło się z powodu przerw w połączeniu lub błędów
5xx, w tym:500 Internal Server Error502 Bad Gateway503 Service Unavailable504 Gateway Timeout
- Jeśli podczas wznawiania lub ponawiania żądań przesyłania wystąpi dowolny błąd serwera
5xx, użyj strategii wykładniczego ponowienia. Te błędy mogą wystąpić, jeśli serwer jest przeciążony. Wykładniczy czas do ponowienia może pomóc łagodzić tego typu problemy w okresach dużej liczby żądań lub dużego ruchu w sieci. - Inne rodzaje żądań nie powinny być obsługiwane przez wykładniczy czas do ponowienia, ale nadal możesz ponawiać kilka prób. Jeśli chcesz ponawiać te żądania, ogranicz liczbę ponownych prób. Na przykład przed zgłoszeniem błędu kod może mieć maksymalnie 10 ponownych prób.
- Podczas przesyłania z możliwością wznowienia usuń błędy
404 Not Found, rozpoczynając przesyłanie od początku.
Wykładniczy czas do ponowienia
Wykładniczy czas ponowienia to standardowa strategia obsługi błędów w aplikacjach sieciowych, w których klient okresowo ponawia nieudane żądanie w coraz większym czasie. Jeśli z powodu dużej liczby żądań lub dużego ruchu sieciowego serwer zwraca błędy, dobrym rozwiązaniem będzie stosowanie wykładniczego czasu do ponowienia. Z drugiej strony nie jest to odpowiednia strategia w przypadku błędów niezwiązanych z ilością sieci czy czasem reakcji, takimi jak nieprawidłowe dane uwierzytelniające autoryzacji lub błędy „Nie znaleziono pliku”.
Prawidłowo używany, rosnący wykładniczy czas ponowienia zwiększa wydajność wykorzystania przepustowości, zmniejsza liczbę żądań wymaganych do uzyskania pomyślnej odpowiedzi i maksymalizuje przepustowość żądań w środowiskach równoczesnych.
Proces implementacji prostego wzrastającego czasu do ponowienia jest następujący:
- Wyślij żądanie do interfejsu API.
- Otrzymasz odpowiedź
HTTP 503, która oznacza, że należy ponowić żądanie. - Odczekaj 1 sekundę + los_number_milliseconds i spróbuj ponownie.
- Otrzymasz odpowiedź
HTTP 503, która oznacza, że należy ponowić żądanie. - Odczekaj 2 sekundy + random_number_milliseconds i spróbuj ponownie.
- Otrzymasz odpowiedź
HTTP 503, która oznacza, że należy ponowić żądanie. - Odczekaj 4 sekundy + random_number_milliseconds i spróbuj ponownie.
- Otrzymasz odpowiedź
HTTP 503, która oznacza, że należy ponowić żądanie. - Odczekaj 8 sekund + los_number_milliseconds i spróbuj ponownie.
- Otrzymasz odpowiedź
HTTP 503, która oznacza, że należy ponowić żądanie. - Odczekaj 16 sekund + los_number_milliseconds i spróbuj ponownie.
- Zatrzymaj. Zgłoś lub zapisz błąd.
W tym przykładzie losowo_liczba_milisekund to losowa liczba milisekund mniejsza lub równa 1000. Jest to konieczne, ponieważ wprowadzenie niewielkiego losowego opóźnienia pomaga bardziej równomiernie rozłożyć obciążenie i uniknąć możliwości „przytłoczenia” serwera. Po każdym oczekiwaniu należy ponownie zdefiniować wartość parametru random_number_milliseconds.
Uwaga: oczekiwanie to zawsze (2 ^ n) + losowa_liczba_milisekund, gdzie n to monotonicznie rosnąca liczba całkowita zdefiniowana początkowo jako 0. Liczba całkowita n zwiększa się o 1 dla każdej iteracji (każdego żądania).
Algorytm wyłącza się, gdy n = 5. Taki limit uniemożliwia klientom ponawianie prób w nieskończoność i powoduje, że żądanie zostaje uznane za „błąd nieodwracalny” wynoszący około 32 sekundy. Większa maksymalna liczba ponownych prób to dobre rozwiązanie, zwłaszcza w przypadku długiego przesyłania. pamiętaj, aby ograniczyć opóźnienie ponawiania do rozsądnej, na przykład niecałej minuty.