фон
Друзья, которые используют Restful Instinct для экспорта этих потребностей, отвергается ~ Он разрушает последовательность Restful URL -адресов [строгая коррекция - это либо HTTP JSON, либо RESTFUL. Многие друзья выставит JSON и назовут его непосредственно]
Как и в генераторе кода, выше, мы будем сгенерировать кучу кодов, большинство из которых являются RestControllers.
Public Abstract Class AbstractRestController <V Extends VO, S Extends SO, PK расширяет Serializable> {Protected Class <v> Voclazz; @Autowired Private Service <V, S, PK> Service; public AbstractRestController () {typetOken <v> wotype = new typetoken <v> (getClass ()) {}; voclazz = (class <v>) watype.getrawtype (); } @Postmapping () @apioperation (value = "new Entity", notes = ") public result (@Requestbody v Vo) {service.saveselective (vo); return resultgenerator.gensuccessresult (); } @Deletemapping ("/{id}") @apioperation (value = "delete entity", notes = ") public result delete (@pathvariable pk id) {service.deletebyid (id); return resultgenerator.gensuccessresult (); } @Putmapping @apioperation (value = "Обновление объекта", Notes = "") return resultgenerator.gensuccessresult (); } @GetMapping @Apioperation (value = "get entity list", notes = ") список публичных результатов (s так) {pageHelper.StartPage (so.getCurrentPage (), so.getPagesize ()); Список <v> list = service.findall (); PageInfo pageInfo = new PageInfo (список); ExcelexportParam (); return resultgenerator.gensuccessresult (pageInfo); } защищенный void excelexportparam () {exportParams ep = new ExportParams (null, "data"); ExcelexPortParam <v> param = new ExcelexPortParam <> (); param.setclazz (voclazz); Param.SetExcelExport (ExceLexport.Normalexcel); param.setexportparams (ep); param.setfilename ("file.xls"); F6static.setExcelExportParam (PARAM); } @GetMapping ("/{id}") @Apioperation (value = "Get Single Entity", notes = "") подробный результат return resultgenerator.gensuccessresult (vo); } @DeletEmpaping ("/pactor") @Apioperation (value = "pactor Delete Entity", notes = "") public Result BatchDelete (@RequestParam String Ids) {service.deleteByids (ids); return resultgenerator.gensuccessresult (); } @GetMapping ("/pactor") @apioperation (value = "pactor get entity", notes = ") public result batchdetail (@RequestParam String Ids) {list <v> vos = service.findbyids (ids); return resultgenerator.gensuccessresult (vos); } @Postmapping ("/parath") @apioperation (value = "packation new Entity", notes = ") public result add (@requestbody list <v> vos) {service.save (vos); return resultgenerator.gensuccessresult (); } @GetMapping ("/count") @apioperation (value = "Получить количество объектов", notes = ") count count (@Requestbody v V) {int count = service.selectcount (v); return resultgenerator.gensuccessresult (count); }Так как экспортировать? [На самом деле, можно понять, что экспорт является отображением данных, но результат - не просто JSON]
Если вопрос поднят, то как насчет входа в систему? Традиционные решения - это вход в систему. Так в чем же идея замены Restful Resources?
Совет: вход в систему - это новая сеанс. Выход - это сеанс удаления.
выполнить
Основываясь на приведенных выше идеях, мы, естественно, думали, что нам нужно вернуть только несколько результатов в один и тот же URL, не так ли? [PDF, одна версия, одна версия, одна версия, одна версия, одна версия, одна версия]
Бинго! Это происхождение переговора по контенту
Переговорщик контента не был создан к весне, на самом деле, это можно увидеть из заголовка HTTP.
1. Например, возвращение на английскую страницу на английский клиент слишком много для китайской страницы.
Протокол HTTP определяет значения качества (называемые значениями Q), которые позволяют клиентам перечислять несколько параметров для каждой категории предпочтений и связывать приоритет для каждого параметра предпочтения.
Принятие языка: en; q = 0,5, fr; q = 0,0, nl; q = 1,0, tr; q = 0,0
Где значение Q колеблется от 0,0 до 1,0 (0,0 является самым низким приоритетом, а 1,0 - самый высокий приоритет).
Обратите внимание, что порядок предпочтений не важен, важно только значение Q, связанное с предпочтениями
2. Тогда есть некоторые другие параметры, такие как заголовка принятия
Обычно у переговорщика по контенту сначала есть следующие решения
1. Используйте заголовок:
Это обычно описано в учебниках. В идеале, этот метод является лучшим, но если ваши ресурсы должны быть доступны непосредственно через браузер (то есть, HTML -дисплей), то из -за различий в браузерах, отправленный заголовок заголовка Accept, будет отличаться. Это заставит сервер не знать, какой формат данных вернуть вам. Ниже приведен заголовок принятия браузера
Chrome: принять: приложение/xml, application/xhtml+xml, textml; q = 0,9, text/plain; q = 0,8, image/png,*/*; q = 0,5 Firefox: принять: text/html, приложение/xhtml+xml, application/xml; q = 0,9,*/*; Image/PJPEG, Application/X-Shockwave-Flash, Application/X-Silverlight, Application/X-MS-Application, Application/X-MS-XBAP, Application/Vnd.MS-XPSDocument, Application/XAML+XML, */ *
2. Используйте расширение
Тот же самый URL был потерян, но этот метод используется больше всего в реальной среде, потому что он больше соответствует эстетическому взгляду на программистов.
Например /SER.JSON /USER.XLS /USER.XML
Использование параметров теперь многие открытые API используют этот метод, например, Taobao
Тем не менее, для разных браузеров, accept header может не быть особенно объединенным, поэтому многие реализации выбирают 2 3 двух решений.
Мы принимаем два вышеупомянутых решения весной
Сначала настроить переговорщик контента
Код
@Bean public viewResolver contentnegotiationviewresolver (ContentNegotiationManager Manager) {// Определить представление Resolvers ViewResolver BeanNameViewResolver = New BeanNameViewResolver (); Список <viewResolver> resolvers = lists.newarraylist (beannameviewresolver); ContentNeGotiatingViewResolver Resolver = новый ContentNeGotiationViewResolver (); Resolver.setViewResolvers (Resolvers); Resolver.setContentNegotiationManager (Manager); вернуть резолвер; } @Override public void configureContentNegotiation (contentNegotiationConfigurer configure) {configururer.favorPathextension (true) .usejaf (false) .favorParameter (true) .parametername ("format") .IgnoreAccepthatheader (true) .defaulttype ("format"). .mediatype ("json", mediaType.application_json) .mediatype ("xls", Excel_Media_type); }Создать соответствующий конвертер
Частный httpmessageconverter <object> createeexcelhttpmessageconverter () {ExcelhttpmessageConverter ExcelhttpmessageConverter = new ExcelhttpmessageConverter (); вернуть ExcelhttpmessageConverter; }Экспорт данных напрямую с помощью Easy-POI
/ * * Copyright (C) 2017. Lorem Ipsum Dolor Sit Amet, CongineTur Adipiscing Elit. * Morbi Non Lorem Porttitor Neque Feugiat Blandit. Ut vitae ipsum eget quam lacinia accumsan. * Etiam SED Turpis AC IPSUM CEDITIMENUM FRINGILLA. Maecenas Magna. * Proin Dapibus sapien Vel Ante. Aliquam erat Volutpat. Pallentesque Sagittis Ligula Eget Metus. * Вестибулярный коммодо. UT RHONCUS GRAVIDA ARCU. */ package com.f6car.base.web.converter; импортировать cn.afterturn.easypoi.excel.excelexportutil; Импорт com.f6car.base.common.result; Import com.f6car.base.core.excelexport; Import com.f6car.base.core.excelexportparam; Import com.github.pageHelper.pageinfo; Импорт com.google.common.collect.lists; Импорт org.apache.poi.ss.usermodel.workbook; Импорт org.springframework.http.httphaders; Импорт org.springframework.http.httpinputmessage; Импорт org.springframework.http.httpoutputmessage; Импорт org.springframework.http.mediatype; Импорт org.springframework.http.converter.abstracttpmessageConverter; Импорт org.springframework.http.converter.generichttpmessageConverter; Импорт org.springframework.http.converter.httpmessagenotreadableexception; Импорт org.springframework.http.converter.httpmessagenotwritexception; импортировать java.io.ioexception; импортировать java.lang.reflect.type; импортировать java.net.urlencoder; Импорт java.util.collection; импортировать java.util.collections; импортировать java.util.collections; импортировать java.util.map; Импорт static com.f6car.base.core.f6static.getExcelexportParam; / ** * @author Qixiaobo */ public Class ExcelhttpmessageConverter extraCTHTTPMessAgeConverter <object> реализует generichtpmessageConverter <object> {public Static final MediaType Excel_Media_type = new MediaType ("Application", "vnd.mscel-excel_media_type = new MediaType (" vance-"); public excelhttpmessageConverter () {super (Excel_Media_Type); } @Override защищенная логическая поддержка (класс <?> Clazz) {return false; } @Override защищенный объект ReadInternal (Class <?> Clazz, httpinputmessage inputmessage) бросает ioexception, httpmessagenotreadableexception {return null; } @Override Protected void writeInternal (Object O, httpoutputmessage outputmessage) бросает ioException, httpmessagenotwritexception {httpheaders headers = outputmessage.getheaders (); Сбор данных = GetActualData ((результат) O); ExceLexPortParam ExcelExportParam = getExcelExportParam (); Рабочая тетрадь; Switch (ExceLexPortParam.getExcelExport ()) {case normalexcel: Workbook = ExcelExportUtil.exportExcel (ExcelExportParam.getExportParams (), (class <?>) ExcelExportParam.getClazz (), (collection <?>) data); перерыв; Case Mapexcel: Workbook = ExceLexPortUtil.ExportExcel (ExceLexPortParam.getExportParams (), ExceLexPortParam.getExcelExportentity (), (Collection <? Extends Map <?,? >>) Данные); перерыв; Case BigExcel: Case Mapexcelgraph: Case Pdftemplate: Case TemplateExcel: Case Templateword: по умолчанию: добавьте новый runtimeexception (); } if (Workbook! = null) {if (ExceLexPortParam.getFilEname ()! = null) {String CodedFilEname = urlencoder.encode (ExcelexPortParam.getFilEname (), "utf8"); Headers.SetContentDispositionFormData («Приложение», CodedFileName); } Workbook.write (outputmessage.getbody ()); }} частная коллекция getActualData (result r) {if (r! = null && r.getData ()! = null) {объект data = r.getData (); if (data exactionof pageInfo) {return (((pageInfo) data) .getList (); } else if (! (EncasionOf collection)) {data = lists.newarraylist (data); } else {return (collection) data; }} return collections.emptylist (); } @Override public boolean canread (тип типа, класс <?> Contextclass, MediaType MediaType) {// Excel return return false не поддерживается; } @Override Public Object Read (Type Type, Class <?> ContextClass, httpinputmessage inputmessage) бросает ioexception, httpmessagenotreadableexception {return null; } @Override public boolean canWrite (тип типа, класс <?> Clazz, mediaType mediaType) {return super.canwrite (mediaType) && clazz == result.class && support (); } private Boolean Support () {ExceLexPortParam param = getExcelExportParam (); if (param == null || param.getexcelexport () == null || param.getexportparams () == null) {return false; } if (param.getExcelexport () == Excelexport.normalexcel) {return true; } else {logger.warn (param.getExcelexport () + "не поддерживает сейчас!"); вернуть ложь; }} @Override public void write (Object O, тип типа, MediaType contentType, httpoutputmessage outputmessage) бросает ioexception, httpmessagenotwritexception {super.write (o, contentype, outputmessage); }}На данный момент это только для экспорта, поэтому при использовании следующего
@Getmapping @apioperation (value = "get entity list", notes = "") список публичных результатов (s so) {pageHelper.StartPage (so.getCurrentPage (), so.getPagesize ()); Список <v> list = service.findall (); PageInfo pageInfo = new PageInfo (список); ExcelexportParam (); return resultgenerator.gensuccessresult (pageInfo); } защищенный void excelexportparam () {exportParams ep = new ExportParams (null, "data"); ExcelexPortParam <v> param = new ExcelexPortParam <> (); param.setclazz (voclazz); Param.SetExcelExport (ExceLexport.Normalexcel); param.setexportparams (ep); param.setfilename ("file.xls"); F6static.setExcelExportParam (PARAM); }Когда мы посещаем
http://127.0.0.1:8079/zeus/user
{ "code": 200, "data": { "endRow": 10, "firstPage": 1, "hasNextPage": true, "hasPreviousPage": false, "isFirstPage": true, "isLastPage": false, "lastPage": 8, "list": [ { "cellPhone": "13857445502", "idEmployee": 24201883434352650, "Idownorg": 23993199378825296, "Idrole": 88, "idwxbstation": "332", "Idwxbuser": "207", "Isadmin": 1, "Open": 0, "ISGUIDEOPEN": 0, ",", ",", ",", ",", ",", ",", ",": 0, ",", ": 0,": 0, ": 0,": 0, ": 0,": 0, ": 0,": 0, ": 0,", ",". "," Пароль ":" 96E79218965EB72C92A549DD5A330112 "," PKID ": 2399319937825296," username ":" Lingweiqice "}, {" "Сотовый телефон": ",", "," Idemploeee ":« IdOhnOR »,« IdOnOR »:« IdOnOR 4, "idwxbstation": "", "", "idwxbuser": "", "Isadmin": 0, "Isdel": 0, "Isguideopen": 0, "Limitmac": 0, "OpenID": "", "пароль": "96E79218965EB72C92A5499DD5A330112", "," PASST 330112 ",", "PASWRY330112", "," PASWRY33012 ",", "PASWRY330112", ",", "96E79218965EB72C92A5499A33012", "96E79218965EB72C92A5499A33011": " 24201883434356532, "username": "007" }, { "cellPhone": "15715139000", "idEmployee": 24351585207523460, "idOwnOrg": 24201883434357600, "idRole": 89, "idWxbStation": "540", «idwxbuser»: «298», «Исадмин»: 1, «Isdel»: 0, «Isguideopen»: 0, «Limitmac»: 0, «OpenID»: «», «Пароль»: «96E79218965EB72C92A549DD5A330112», «PKID»: 242018343434343434343434343434343434343434343434343434343434343434343443434. «Имя пользователя»: «15715139000»}, {«мобильный телефон»: «», «Idemployee»: 0, «Idownorg»: 24201883434357600, «Idrole»: 216, «idwxbstation»: «», «idwxbuser»: «isadmin»: 0, «isedel»: 0, «Iryde»: «Irydel»: «Irydel»: «IdeL»: «IDEL»: 0, «IDEL». 0, "limitMac": 0, "openid": "", "password": "96e79218965eb72c92a549dd5a330112", "pkId": 24201883434357920, "username": "sunlingli" }, { "cellPhone": "", "idEmployee": 24351585207425676, "Idownorg": 24201883434359384, "Idrole": 90, "idwxbstation": "348", "Idwxbuser": "227", "Isadmin": 1, "Open": 0, "ISGUIDEOPen", ",", ",", ",", ",", ",", ",", ",", ",", ":": ":": ":": 0, ": 0,": 0, ": 0,": 0, ": 0,": 0, ": 0,": 0, ": 0,": 0, ":". "Opzuds_v13we500kxymj6xg_gfee", "пароль": "96E79218965EB72C92A549DD5A330112", "PKID": 2420188343435938, "username": "15952920979" table "," ",", ",", ",", ",", "", ",", ",", ",", ",", ",", ",", ",", ":", ",", ",", ",", ",", ",", ",": ",", ". «Idemployee»: 0, «Idownorg»: 24201883434359790, «Idrole»: 91, «idwxbstation»: «315», «idwxbuser»: «175», «Исадмин»: 1, «Isdel»: 0, «Isguideopen»: 0, «Limit»: «Открой»: «Открой»: «Открой»: «Открой»: «Отк. "96E79218965EB72C92A549DD5A330112", "PKID": 24201883434359790, "Имя пользователя": "13809056211"}, {"сотовой телефон": "18903885585", "Idemploeete": 2420188888866666666666666666666666666666666 «Idownorg»: 24201883434359890, «Idrole»: 92, «idwxbstation»: «317», «idwxbuser»: «178», «Исадмин»: 1, «Иссдел»: 0, «Isguideopen»: 0, «Limitmac»: 0, «Opendid»: «»: «»: «»: «»: «»: «»: «»: ",", ",", ",", ",", ",", ",": ",", ",", ":", ",", ":", ",", ":": ",", ",": ",", ",": ":", ",": ",": ",", "." "96E79218965EB72C92A549DD5A330112", "PKID": 24201883434359892, "Имя пользователя": "18903885585"}, {"" Сотовый телефон ":", "Idemployee": 24351585574666666666666666666666666666666686666666666666666666666666686868686868686868686666666oN568, ",", "Idemployee": Idemployee ": Idemployee 24201883434359924, «Idrole»: 93, «idwxbstation»: «318», «idwxbuser»: «179», «Исадмин»: 1, «Isdel»: 0, «Isguideopen»: 0, «Limitmac»: 0, «OpenD»: «Пароль»::: "96E79218965EB72C92A549DD5A330112", "PKID": 24201883434359930, "Имя пользователя": "13372299595"}, {"сотовой телефон": "," Idemployee ": 0," Idownorg ": 242018343434343434343434343434343434343434343434343434343434343434343434 «Idrole»: 94, «idwxbstation»: «321», «idwxbuser»: «188», «Исадмин»: 1, «Isdel»: 0, «Isguideopen»: 0, «Limitmac»: 0, «openid»: «», «Пароль»: «96E79218965EB72C92A54999999999. "PKID": 24201883434360052, "username": "15221250005"}, {"сотовой телефон": "", "Idemployee": 0, "Idownorg": 24201883434360070, "Idrole": 95, Idwxbstation ":" 32550070 "," Idrole ": 95, IDWXBStation": "32550070": "95, IDWXBStation": "32550070": ":" 95, IDWXBSTATION "Isadmin": 1, "Isdel": 0, "Isguideopen": 0, "Limitmac": 0, "OpenID": "," пароль ":" 96E79218965EB72C92A549DD5A330112 "," PKID ": 24201883434360070," 13887777777777777 гг. }], "NavigateFirstPage": 1, "NavigatelastPage": 8, "NavigatePages": 8, "NavigatePagenums": [1, 2, 3, 4, 5, 6, 7, 8], "Next Page": 2, "OrderBy": "", "Pagenum": 1, "Pageize": 10, Pages ": 102,", ",", ":": ":", ",": ",", ",": ":": ",": ",", ",", ",": 1, ": 1,": ": 102", ",", ",", ":". 10, «Startrow»: 1, «Total»: 1012}, «Сообщение»: «Успех»}При доступе к http://127.0.0.1:8079/zeus/user?format=xls или http://127.0.0.1:8079/zeus/user.xls
Следующие эффекты
Поскольку данные здесь связаны с запросом, мы можем работать таким образом http://127.0.0.1:8079/zeus/user.xls?pagesize=1000 легко реализовать xlsization результатов запроса!
Суммировать
Выше приведено иллюстрация переговора по контенту в Springboot, представленном вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!