موقعی که یک API طراحی میکنیم ما معمولا باید نوع مدیای producer/consumer را مشخص کنیم که این میتواند مدیاهای مختلفی که بعدا ممکن است نیاز داشته باشیم را محدود کند
همچنین Http Header پارامتر Accept میتواند مشخص کند که کلاینت چه مدیاهایی را میتواند قبول کند و ما در سمت سرور میتوانیم یکی از انواع مورد قبول را استفاده کنیم و در صورتی که سمت سرور هیچکدام از مدیا های مورد حمایت کلاینت را نداشته باشیم Spring MVC خطای HttpMediaTypeNotAcceptableException را پرتاب میکند
در این بخش یاد میگیریم که وقتی به خطای HttpMediaTypeNotAcceptableException برخورد کردیم چه کاری را باید انجام دهیم
مثال عملیاتی دریافت خطای HttpMediaTypeNotAcceptableException :
کنترل را یا کد زیر در نظر بگیرید :
@PostMapping( value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public Map<String, String> example() { return Collections.singletonMap("key", "value"); }
و کلاینت درخواست خود را اینگونه ارسال میدارد :
curl -X POST --header "Accept: application/pdf" http://localhost:8080/test -v > POST /test HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.51.0 > Accept: application/pdf
همانطور که میبینیم کلاینت درخواست مدیا از نوع pdf کرده است که در سمت سرور ارائه نمیشود و پیام زیر در response کلاینت دریافت میشود:
< HTTP/1.1 406 < Content-Length: 0
در این مواقع تنها را حلی که وجود دارد استفاده از مدیریت خطای HttpMediaTypeNotAcceptableException است :
@ResponseBody @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) public String handleHttpMediaTypeNotAcceptableException() { return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE; }
در Spring پیام خطای ارسالی به سمت کلاینت به صورت پیش فرض خالی است ولی ما میتوانیم با ایجاد ExceptionHandler سفارشی یک پیام آگاهی دهنده از خطا را که به کاربر نمایش دهد را هم ارسال کنیم