REST - JSON ile HTTP Post Multipart


89

Yalnızca 2 parametre içeren bir HTTP Post Multipart almam gerekiyor:

  • JSON dizesi
  • Bir ikili dosya

Vücudu yerleştirmenin doğru yolu hangisidir? Chrome REST konsolunu kullanarak HTTP çağrısını test edeceğim, bu yüzden doğru çözümün JSON parametresi ve ikili dosya için bir "etiket" anahtarı ayarlamak olup olmadığını merak ediyorum.

Sunucu tarafında Resteasy 2.x kullanıyorum ve Multipart gövdesini şu şekilde okuyacağım:

@POST
@Consumes("multipart/form-data")
public String postWithPhoto(MultipartFormDataInput  multiPart) {
  Map <String, List<InputPart>> params = multiPart.getFormDataMap();
  String myJson = params.get("myJsonName").get(0).getBodyAsString();
  InputPart imagePart = params.get("photo").get(0);
  //do whatever I need to do with my json and my photo
}

Gitmenin yolu bu mu? JSON dizgimi söz konusu içerik düzenini tanımlayan "myJsonName" anahtarını kullanarak almak doğru mu? Bu 2 içeriği tek bir HTTP çok parçalı isteğinde almanın başka bir yolu var mı?

Şimdiden teşekkürler


1
Bu ne tür bir REST kaynağıdır? İki bölümün kaynak düzeyinde nasıl bir ilişkisi var?

Aslında bu kaynağı ele alma şeklimiz tamamen RESTful değildir çünkü görüntü başka bir kaynak yerine kaynağın bir "bileşeni" dir.
thermz

Yanıtlar:


149

Sizi doğru anlarsam, bir HTTP / REST konsolundan manuel olarak çok parçalı bir istek oluşturmak istersiniz. Çok parçalı biçim basittir; HTML 4.01 spesifikasyonunda kısa bir giriş bulunabilir . İçerikte bulunmayan bir dize olan bir sınır bulmanız gerekiyor diyelim HereGoes. İstek başlığını ayarlarsınız Content-Type: multipart/form-data; boundary=HereGoes. O zaman bu geçerli bir istek gövdesi olmalıdır:

--HereGoes
Content-Disposition: form-data; name="myJsonString"
Content-Type: application/json

{"foo": "bar"}
--HereGoes
Content-Disposition: form-data; name="photo"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

<...JPEG content in base64...>
--HereGoes--

Aslında soap-ui'ye de bir ek ekleyebilirsiniz. Bu, gerçek yazı gövdesine ve içerik türüne geçme zorunluluğunu azaltır.
shane lee

1
Eşsiz sınırı bulmanın standart bir yolu var mı?
andig

2
@andig Ben hiç farkında değilim. Belki bir UUID kullanabilirsiniz , ancak bu mutlaka iyi bir fikir değildir. Normalde HTTP kitaplığınız bunu sizin için halletmelidir.
Vasiliy Faronov

İstekte yalnızca json ve base64 verilerimiz olduğunu biliyorsak \*, örneğin bir sınır olarak çalışmamalı mı? Ne json ne de base64'te var olmasına izin verilmez.
DaedalusAlpha

2
JPEG verilerini kodlamak için neden base64 kullanılıyor? HTTP, ham baytları göndermenize izin verir.
Alexandre Blin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.