REST: przesyłanie danych binarnych metodą PUT

Sep 02 2020

Mam spokojną aplikację, która używa PUT do zastąpienia istniejących danych. Na przykład istnieje adres URL zarządzania użytkownikami https: // myserver / users, a aby zastąpić dane użytkownika, na przykład, aby zmienić nazwę i wynagrodzenie użytkownika o id = 123, używam https: // myserver / users / 123 z application / json zakodował dane nowego użytkownika w treści żądania, takie jak:

{
    name: "John",
    salary: 123.45
}

Teraz muszę również zarządzać zdjęciami użytkowników. I. e. mieć możliwość wgrania zdjęcia użytkownika od klienta (ecmascript spa) i zmiany go (w celu przechowywania, zastąpienia, jeśli istnieje) na serwerze. Pytanie brzmi: jak wgrać obraz binarny metodą PUT? Używam javy po stronie serwera, czystych serwletów lub jax-rs, jeśli jest to ważne. Ale chciałbym zrozumieć „właściwy” i „poprawny” RESTful sposób, aby to zrobić. Widzę następujące możliwości:

  1. Aby uwzględnić dane zakodowane w standardzie Base64 w treści JSON jako ciąg. Ale zdjęcie może być dość duże, więc nie jest to droga.
  2. Aby użyć multipart / form-data. Ale ani mój kontener serwletów, ani jax-rs nie są w stanie przeanalizować takich żądań automatycznie, zezwalając na automatyczne analizowanie danych formularza wieloczęściowego tylko dla metody POST.
  3. Aby przesłać zdjęcie za pomocą POST za pomocą dedykowanego adresu URL, a następnie użyć identyfikatora zapisanego zdjęcia w PUT. Ale nie wygląda to na właściwy sposób RESTful dla mnie i do zaimplementowania tego potrzebne byłyby 2 żądania.

Więc moje pytanie jest bardziej powszechne - jaki jest najwygodniejszy sposób załatwienia takiej sprawy?

Odpowiedzi

3 Blake Sep 02 2020 at 02:02

Po prostu potraktuję to jako osobny zasób i wykorzystam post np. POST / users / 123 / profile-picture. Ułatwia to również dodawanie profilu do strony internetowej, jeśli to właśnie robisz. na przykład:

<img src="/users/123/profile-picture">