Stackoverflow'ta verilen çeşitli yöntemleri denedim, belki bir şeyleri özledim. Bahar Önyükleme denetleyicisinde bir görüntüyü döndürme ve bir dosya sistemi gibi hizmet verme
Şu anda böyle bir görüntü elde ediyor (kimin kod ı değiştiremezsiniz) bir Android istemcisi vardır:url
resmin konumunu (CDN üzerinde statik kaynak) 'dir
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
. Şimdi Spring Boot API son noktamızın aynı kaynakta olduğu gibi bir dosya kaynağı gibi davranması gerekiyor, böylece aynı kodlar API'den görüntüler alabilir (Spring boot version 1.3.3).
Yani bu var:işleyicisi [kamu org.springframework gelen istisnaları çözme: Android kod
http://someurl/image1.jpg
benim günlüklerinde bu hatayı olsun elde etmeye çalışır Şimdi. http.ResponseEntity com.myproject.MyController.getImage (java.lang.String)]: org.springframework.web.HttpMediaTypeNotAcceptableException: kabul edilebilir gösterimi bulunamıyor@ResponseBody @RequestMapping(value = "/Image/{id:.+}", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = MediaType.IMAGE_JPEG_VALUE) public ResponseEntity<byte[]> getImage(@PathVariable("id")String id) { byte[] image = imageService.getImage(id); //this just gets the data from a database return ResponseEntity.ok(image); }
Bir tarayıcıya http://someurl/image1.jpg
'u bağladığımda aynı hata meydana gelir.
Garip benim testler Tamam check out:
Response response = given()
.pathParam("id", "image1.jpg")
.when()
.get("MyController/Image/{id}");
assertEquals(HttpStatus.OK.value(), response.getStatusCode());
byte[] array = response.asByteArray(); //byte array is identical to test image
Nasıl bu bir görüntü normal şekilde sunulmakta gibi davranmaya alabilirim? (Ben android kod gönderiyor içerik tipi başlığını değiştiremezsiniz Not)
DÜZENLEME
Kod sonra yapılan yorumlar (produces
çıkar, içerik türünü ayarlayın):
@RequestMapping(value = "/Image/{id:.+}", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE)
public ResponseEntity<byte[]> getImage(@PathVariable("id")String id, HttpServletResponse response) {
byte[] image = imageService.getImage(id); //this just gets the data from a database
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
return ResponseEntity.ok(image);
}
Bir tarayıcıda bu sadece bir dizili hurda (sanırım chars bayt) vermek gibi görünüyor. Android'de hata yapmıyor, ancak resim gösterilmiyor. Bu işe gerektiğine inanıyoruz
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
final List<MediaType> list = new ArrayList<>();
list.add(MediaType.IMAGE_JPEG);
list.add(MediaType.APPLICATION_OCTET_STREAM);
arrayHttpMessageConverter.setSupportedMediaTypes(list);
converters.add(arrayHttpMessageConverter);
super.configureMessageConverters(converters);
}
İstemci Accept üstbilgisi olarak ne gönderiyor?Üretme özelliğini kaldırdığınızda ne olur ve yalnızca yanıtta içerik türünü belirtin? –
@JBNizet Accept üstbilgisi, HttpURLConnection (Android SDK) için varsayılan değerdir. Kesinlikle özel olarak ayarlanmadı. Üretimi ihmal etmeyi denedim, ancak bu düz metin (tarayıcıda) veriyor gibi görünüyor. İçerik türünü ayarlamak zaten "üretir" ile aynıdır, değil mi? –
@JBNizet İçerik türünü de açık bir şekilde ayarlamayı denedim, aynı hatayı –