يوفر الواجهة الخلفية الخدمات ، وعادة ما تُرجع سلسلة JSON ، ولكن في بعض السيناريوهات ، قد يكون من الضروري إرجاع الدفق الثنائي مباشرة ، مثل واجهة تحرير الصور ، على أمل إعادة دفق الصورة مباشرة إلى الواجهة الأمامية. ماذا يمكن القيام به في هذا الوقت؟
الاستخدام الرئيسي هو كائن httpservletresponse ، ويتم تنفيذ الحالة على النحو التالي
requestmapping (value = {"/img/render"} ، method = {requestMethod.get ، requestMethod.post ، requestMethod.options})@crossorigin (Origins = "*")@reviewbodypublic string ( الدفق الثنائي لبايت الصورة [] img = xxx ؛ httpservletresponse.setContentType ("Image/PNG") ؛ OutputStream OS = httpservletResponse.getOutputStream () ؛ OS.Write (IMG) ؛ os.flush () ؛ OS.Close () ؛ إرجاع "النجاح" ؛}أشياء يجب ملاحظتها
بشكل عام ، غالبًا ما تُرجع واجهة الخدمة التي توفرها الواجهة الخلفية بيانات JSON. كما ذكرنا سابقًا ، فإن مشهد العودة مباشرة ، فما هي الطرق الشائعة لإعادة الصور؟
فكيف ينبغي أن نقدم وحدة التحكم دعم لمواقف الاستخدام الثلاثة أعلاه في نفس الوقت؟
نظرًا لوجود العديد من الطرق المختلفة للعودة ، كما هو الحال بالنسبة للاختيار ، بالطبع يتم تحديده من خلال الواجهة الأمامية ، بحيث يمكنك تحديد كائن الفول الذي يطلب المعلمات.
datapublic class baserequest {private static final long serialversionuid = 1146303518394712013l ؛ / ** * طريقة إخراج صورة: * * url: عنوان http (الطريقة الافتراضية) * base64: base64 الترميز * دفق: صورة إرجاع مباشرة * */ سلسلة خاصة OutType ؛ /*** إرجاع نوع الصورة* JPG | PNG | ويب | GIF */ private String MediaType ؛ Publictypeenum returntype () {return returntypeenum.getenum (OutType) ؛ } MediaTypeEnum mediaType () {return mediaTypeEnum.getenum (MediaType) ؛ }}من أجل تبسيط الحكم ، تم تعريف اثنين من التعليقات التوضيحية ، واحد returntypeenum و mediaTypeenum الأخرى. بالطبع ، الضرورة ليست كبيرة بشكل خاص. ما يلي هو تعريف كليهما.
التعداد العام returntypeenum {url ("url") ، دفق ("دفق") ، base64 ("base") ؛ نوع السلسلة الخاصة ؛ returntypeenum (نوع السلسلة) {this.type = type ؛ } الخريطة الثابتة الخاصة <string ، returntypeenum> map ؛ ثابت {map = new hashmap <> (3) ؛ لـ (returntypeenum e: returntypeenum.values ()) {map.put (e.type ، e) ؛ }} static static static returntypeenum getEnum (نوع السلسلة) {if (type == null) {return url ؛ } returntypeenum e = map.get (type.toLowerCase ()) ؛ العودة e == فارغة؟ عنوان URL: E ؛ }} datapublic enum mediaTypeEnum {imageJPG ("jpg" ، "Image/JPEG" ، "ffd8ff") ، ImageGif ("gif" ، "Image/GIF" ، "47494638") ، ImagePng ("png" ، "Image/png" ، "89504e47") "52494646") ، سلسلة نهائية خاصة ؛ سلسلة نهائية خاصة. سحر السلسلة النهائية الخاصة ؛ MediaTypeEnum (String Ext ، String mime ، String Magic) {this.ext = ext ؛ this.mime = mime ؛ this.magic = السحر ؛ } الخريطة الثابتة الخاصة <string ، mediaTypeEnum> map ؛ ثابت {map = new hashmap <> (4) ؛ لـ (mediaTypeEnum e: dorement ()) {map.put (e.getext () ، e) ؛ }} public static mediaTypeEnum getEnum (نوع السلسلة) {if (type == null) {return imageJpg ؛ } mediaTypeEnum e = map.get (type.toLowerCase ()) ؛ العودة e == فارغة؟ ImageJPG: E ؛ }}ما سبق هو الفاصوليا المغطاة مع معلمة الطلب. بالطبع ، هناك أيضًا حبة مقابلة للعودة.
datapublic class baseresponse { / *** إرجاع المسار النسبي للصورة* / private string path ؛ / *** إرجاع تنسيق HTTPS للصورة*/ url السلسلة الخاصة ؛ / *** صورة بتنسيق Base64*/ قاعدة السلسلة الخاصة ؛}يوضح:
في بيئة المشروع الفعلية ، لن تكون معلمات الطلب والعائد بسيطة على النحو الوارد أعلاه ، بحيث يمكنك تنفيذها عن طريق وراثة الفول أعلاه أو تحديد التنسيق المقابل بنفسك.
نظرًا لأن الهدف واضح ، فإن العبوة هي أوضح خطوة في هذا
Buyresponse المحمي (طلب BaseRequest ، استجابة baseresponse ، البايت [] بايت) يلقي selferror {switch استراحة؛ Case Base64: BASE64 (بايت ، استجابة) ؛ استراحة؛ دفق الحالة: دفق (بايت ، طلب) ؛ }} تحميل باطل خاص (بايت [] بايت ، استجابة baseresponse) يلقي selferror {try {// expload على خادم الصور واستبدل string path = uploadutil.upload (bytes) ؛ if (stringUtils.IsBlank (path)) {// Upload فشل رمي internalerror جديد (null) ؛ } response.setPath (path) ؛ استجابة. } catch (ioException e) {// cdn inscply log.error ("endload to cdn error! e: {}" ، e) ؛ رمي cdnuploaderror جديد (e.getMessage ()) ؛ }} // return base64private void base64 (byte [] bytes ، baseresponse strave) {String base = base64.getencoder (). EncodetoString (bytes) ؛ استجابة. httpservletresponse servletResponse = ((servletRequestatTributes) requestContextholder.getRequestatTributes ()). getResponse () ؛ servletResponse.setContentType (mediaType.getMime ()) ؛ OutputStream OS = servletResponse.getOutputStream () ؛ OS.Write (بايت) ؛ os.flush () ؛ OS.Close () ؛ } catch (استثناء e) {log.error ("General Return Dream IMG error! req: {} ، e: {}" ، request ، e) ؛ if (stringUtils.isNotBlank ( } آخر {رمي internalerror جديد (null) ؛ }}}يوضح:
يرجى تجاهل طرق الاستثناء المخصصة أعلاه. عندما تحتاج إلى استخدامها ، يمكنك التخلص تمامًا من هذه الاستثناءات المخصصة ؛ هنا أتحدث باختصار عن سبب استخدام طريقة الاستثناء المخصصة هذه في المشاريع الفعلية ، ويرجع ذلك أساسًا إلى المزايا التالية
بالاقتران مع التقاط الاستثناء العالمي (ControllerAdvie) ، فهي مريحة للغاية وسهلة الاستخدام
يتم التعامل مع جميع الاستثناءات مركزيًا لتسهيل إحصائيات المعلومات والإنذار
على سبيل المثال ، بعد إجراء عدد استثناء في مكان موحد ، ثم تجاوز عتبة معينة ، اتصل بالشخص المسؤول ، لذلك ليست هناك حاجة لدفن النشاط في كل مكان تحدث فيه حالة استثناء.
تجنب نقل طبقة كل طبق من رموز حالة الخطأ
- هذا أساسا لخدمات الويب. بشكل عام ، يحتوي على رمز حالة الخطأ المقابل ورسالة الخطأ في سلسلة JSON التي تم إرجاعها.
- قد تظهر حالة الاستثناء في أي مكان. من أجل الحفاظ على معلومات الاستثناء هذه ، يتم تمرير البيانات إلى طبقة وحدة التحكم حسب الطبقة ؛ أو تم العثور عليها في threadlocal. من الواضح أنه لا يوجد أي من هذه الطرق مريحة للاستخدام
بالطبع ، هناك عيوب:
طريقة الاستثناء ، إضافية الأداء ، لذلك في الاستثناءات المخصصة ، لقد غطيت الطريقة التالية ، ليس لدي مكدس كامل
Overridepublic المزامنة FillInstackTrace () {return this ؛}قد لا يحب بعض الأشخاص طريقة عادات الترميز هذه
لا يبدو من المثير للاهتمام أن تقول أنك لا تمارس. ينعكس التصميم أعلاه بالكامل في وسائل الوسائط السريعة للمشروع المفتوح المصدر الذي كنت أحتفظ به. بالطبع ، هناك بعض الاختلافات من ما سبق. بعد كل شيء ، يرتبط أكثر بالعمل. إذا كنت مهتمًا ، فيمكنك الرجوع إليها.
Quickmedia: https://github.com/liuyueyi/quick-media:
BASEACTION: com.hust.hui.quickmedia.web.wxapi.wxbaseactation#buildReturn
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.