Hintergrund
Freunde, die einen erholsamen Instinkt verwenden, um diese Bedürfnisse zu exportieren, wird abgelehnt. Sie zerstört die Konsistenz von erholsamen URLs [strenge Korrektur ist entweder HTTP JSON oder RESTful. Viele Freunde werden einen JSON enthüllen und ihn direkt als erholsam nennen.
Wie im obigen Codegenerator werden wir eine Reihe von Codes generieren, von denen die meisten Restcontroller sind.
public abstract class AbstracttrestController <V erweitert VO, S erweitert, dass PK serialisierbar> {geschützte Klasse <V> Voclazz; @Autowired Private Service <V, S, PK> Service; public abStractrestController () {TypEToken <V> votype = new TypEToken <V> (getClass ()) {}; voclazz = (class <V>) votype.getrawtype (); } @Postmapping () @apioperation (value = "New Entity", Notes = "") öffentliches Ergebnis add (@RequestBody v vo) {service.saveselective (vo); return resultgenerator.genuccessResult (); } @DeletMapping ("/{id}") @APIOperation (value = "Entity", Notes = "") öffentliches Ergebnis Delete (@PathVariable pk id) {service.deletebyId (id); return resultgenerator.genuccessResult (); } @Putmapping @apioperation (value = "Entity aktualisieren", Notes = "") Public Ergebnis -Update (@RequestBody v vo) {service.UpdateByprimaryKeysselective (Vo); return resultgenerator.genuccessResult (); } @GetMapping @APIOperation (value = "Entity -Liste erhalten", Notes = "") öffentliche Ergebnisliste (s so) {pageHelper.startPage (so.getCurrentPage (), so.getPageSize ()); Liste <V> list = service.findall (); PageInfo pageInfo = new PageInfo (Liste); excelexportParam (); return resultgenerator.genuccessResult (pageInfo); } protected 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 = "") öffentliches Ergebnisdetail (@PathVariable pk id) {v vo = service.findbyId (id); return resultgenerator.genuccessResult (vo); } @DeletMapping ("/batch") @APIOperation (value = "batch löschen entität", Notes = "") public result batchDelete (@RequestParam String ids) {service.deletebyids (ids); return resultgenerator.genuccessResult (); } @Getmapping ("/batch") @APIOperation (value = "batch Get Entity", Notes = "") public result batchDetail (@RequestParam String ids) {list <V> vos = service.findbyids (ids); return Ergebnisgenerator.genuccessResult (VOS); } @Postmapping ("/batch") @apioperation (value = "batch New Entity", Notes = "") öffentliches Ergebnis add (@RequestBody List <V> vos) {service.save (vos); return resultgenerator.genuccessResult (); } @GetMapping ("/count") @APIOperation (value = "Die Anzahl der Entitäten erhalten", Notes = "") öffentlicher Ergebnis Count (@RequestBody v v) {int count = service.SelectCount (v); return Ergebnisgenerator.genuccessResult (Graf); }Wie exportieren Sie also? [Tatsächlich ist zu verstehen, dass der Export die Anzeige von Daten ist, aber das Ergebnis ist nicht nur JSON]
Wenn eine Frage aufgeworfen wird, was ist dann mit dem Anmelden? Traditionelle Lösungen sind Anmeldungsanmelde. Was ist die Idee, erholsame Ressourcen zu ersetzen?
Tipp: Login ist die neue Sitzung. Logout ist die Löschung.
erreichen
Basierend auf den obigen Ideen dachten wir natürlich, dass wir nur mehrere Ergebnisse an die gleiche URL zurückgeben müssen. Ist es nicht in Ordnung? [PDF, eine Version, eine Version, eine Version, eine Version, eine Version, eine Version]
Bingo! Dies ist der Ursprung des Inhaltsverhandlungsführer
Der Inhaltsverhandlungsführer wurde nicht durch den Frühling erstellt. Tatsächlich ist dies aus dem HTTP -Header zu sehen.
1. Die Rückkehr zur englischen Seite zum englischen Kunden ist beispielsweise zu viel für die chinesische Seite.
Das HTTP -Protokoll definiert Qualitätswerte (als q -Werte bezeichnet), mit denen Clients mehrere Optionen für jede Präferenzkategorie auflisten und eine Priorität für jede Präferenzoption assoziieren können.
Akzeptierende Sprache: EN; Q = 0,5, FR; Q = 0,0, NL; Q = 1,0, TR; Q = 0,0
Wobei der Q -Wert zwischen 0,0 und 1,0 liegt (0,0 ist die niedrigste Priorität, während 1,0 die höchste Priorität hat).
Beachten Sie, dass die Reihenfolge der Präferenzen nicht wichtig ist. Nur der Q -Wert in Bezug auf Präferenzen ist wichtig
2. Dann gibt es einige andere Parameter wie Akzeptanzüberschuss
Normalerweise hat der Inhaltsverhandlungsführer zuerst die folgenden Lösungen
1. Verwenden Sie Kopfzeile:
Dies ist in Lehrbüchern häufig beschrieben. Im Idealfall ist diese Methode die beste, aber wenn Ihre Ressourcen direkt über den Browser (d. H. HTML -Display) zugegriffen werden sollen, ist der gesendete Header -Header aufgrund von Browserunterschieden unterschiedlich. Dadurch wird der Server nicht weiß, welches Datenformat zu Ihnen zurückgegeben werden sollen. Das Folgende ist der Akzeptanzkopf des Browsers
Chrom: Akzeptieren: Anwendung/xml, Anwendung/xhtml+xml, textml; q = 0,9, text/name; q = 0,8, Bild/png,*/*; q = 0,5 Firefox: Akzeptieren: text/html, application/xhtml+xml, application/xml; q = 0,9, q = 0. q = 0,8 IE8: Akzeptieren: Accome: Accome: Accome, Accome: Accept, Accome: Accept, Accome, Accord,*/*; Bild/PJPEG, Anwendung/X-Shockwave-Flash, Application/X-Silverlight, Application/X-MS-Application, Application/X-MS-XBAP, Application/Vnd.ms-XpsDocument, Application/XAML+XML, */ *
2. Verwenden Sie Erweiterung
Die gleiche URL ist verloren gegangen, aber diese Methode wird in der tatsächlichen Umgebung am meisten angewendet, da sie eher mit der ästhetischen Sicht der Programmierer übereinstimmt.
Zum Beispiel /user.json /user.xls /user.xml
Verwenden von Parametern jetzt viele offene APIs verwenden diese Methode, wie z. B. Taobao
Für verschiedene Browser ist jedoch möglicherweise nicht besonders einheitlich, so dass viele Implementierungen 2 3 zwei Lösungen wählen.
Wir übernehmen die oben genannten zwei Lösungen im Frühjahr
Konfigurieren Sie zuerst den Inhaltsverhandlungsführer
Code
@Bean public viewResolver contentNegotiTiingViewResolver (ContentNegotiationManager Manager) {// Definieren Sie die Ansicht Resolvers ViewResolver BeannameViewResolver = new BeEannameViewResolver (); List <SeviewResolver> resolvers = lists.NewarrayList (BeannameviewResolver); ContentNegotiTiingViewResolver Resolver = new ContentNegotiTiingViewResolver (); Resolver.SetViewResolvers (Resolver); Resolver.SetContentNegotiationManager (Manager); Return Resolver; } @Override public void configureContentNegotiation (ContentNegotiationConFigurer configure) {configurer .mediatype ("JSON", mediatype.application_json) .mediAtpe ("xls", excel_media_type); }Erstellen Sie den entsprechenden Konverter
private httpMessageConverter <Object> createexcelHttpMessageConverter () {excelHttpMessageConverter excelHttpMessageConverter = new ExcelHttpMessageConverter (); return excelhttpMessageConverter; }Daten direkt mit Easy-POI exportieren
/ * * Copyright (C) 2017. Lorem Ipsum Dolor Sit Amet, Konsistende Adipiscing Elit. * Morbi Non Lorem Porttitor Nque Fegiat Blandit. Ut Vitae Ipsum Eget Quam Lacinia Accumsan. * Etiam sed turpis ac ipsum celdimentum fringilla. Maecenas Magna. * Proin Dapibus Sapien Vel ante. Aliquam Erat Volutpat. Pellentesque Sagittis Ligula Eget Metus. * Vestibular Commodo. Ut Rhoncus gravida arcu. */ paket com.f6car.base.web.converter; import cn.afterturn.easypoi.excel.excelexportUtil; import com.f6car.base.common.result; import com.f6car.base.core.excelexport; import com.f6car.base.core.excelexportParam; import com.github.pageHelper.pageInfo; import com.google.common.collect.lists; import org.apache.poi.s.usermodel.workbook; import org.springframework.http.httpheaders; import org.springframework.http.httpinputMessage; import org.springframework.http.httpoutputMessage; import org.springframework.http.MediType; import org.springframework.http.converter.abstracthttpMessageConverter; import org.springframework.http.converter.generichttpMessageConverter; import org.springframework.http.converter.httpMessagenotreadableException; import org.springframework.http.converter.httpMessagenotwritablexception; importieren java.io.ioException; importieren java.lang.reflect.type; importieren java.net.urlencoder; Import Java.util.Collection; Import Java.util.Collections; Import Java.util.Collections; import Java.util.map; static com.f6car.base.core.f6static.getExcelexportParam importieren; /** * @author qixiaobo */ public class ExcelHttpMessageConverter extends AbstractHttpMessageConverter<Object> implements GenericHttpMessageConverter<Object> { public static final MediaType EXCEL_MEDIA_TYPE = new MediaType("application", "vnd.ms-excel"); public excelHttpMessageConverter () {Super (excel_media_type); } @Override Protected Boolean unterstützt (Klasse <?> Clazz) {return false; } @Override Protected Object readInternal (Klasse <?> Clazz, httpinputMessage InputMessage) löst IOException, httpMessagenotreadableException {return null; } @Override Protected void writeInternal (Object O, httpoutputMessage outputMessage) löst IOException aus, httpMessagenotRabitableAnception {httpheaders headers = outputMessage.Getheaders (); Sammlerdaten = getactualData ((Ergebnis) O); ExcelexportParam excelexportParam = getExcelexportParam (); Arbeitsbuch Arbeitsbuch; Switch (excelexportParam.getExcelexport ()) {case normalexcel: workbook = excelexportil.exportExcel (excelexportParam.getExportParams (), (Klasse <>) excelexportParam.getClazz (), (Sammlung <>) Daten; brechen; case mapexcel: workbook = excelexportUtil.exportExcel (excelexportParam.getExportParams (), excelexportParam.getExcelexportentities (), (Sammlung <? Erweitert Karte <,? >>) Daten); brechen; Fall BigExcel: case mapexcelgraph: case pdftemplate: case templateExcel: case templateword: Standard: standardneue runTimeexception (); } if (workbook! = null) {if (excelexportParam.getFileName ()! Header.SetContentDispositionFormData ("Attachment", codedFileName); } Workbook.write (outputMessage.getBody ()); }} private Sammlung getActualData (Ergebnis r) {if (r! = null && r.getData ()! = null) {Object Data = R.GetData (); if (Data InstanceOf pageInfo) {return ((pageInfo) data) .getList (); } else if (! (Dateninstanz von Sammlung)) {data = lists.NewarrayList (Data); } else {return (collection) data; }} return Collections.EmptyList (); } @Override public boolean canread (Typtyp, Klasse <?> ContextClass, mediType mediType) {// Excel return false wird nicht unterstützt; } @Override öffentliches Objekt lesen (Typtyp, Klasse <?> ContextClass, httpInputMessage InputMessage) löst ioException, httpMessagenotreadableException {return null aus; } @Override public boolean canwrite (Typtyp, Klasse <?> Clazz, Mediatype mediatype) {return super.canwrite (mediateType) && 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 () + "jetzt nicht unterstützen!"); false zurückgeben; }} @Override public void write (Object O, Typtyp, MediaType contentType, httpoutputMessage outputMessage) löscht IOException, httpMessagenotRabitablexception (Super.Write (O, ContentType, OutputMessage)) aus; }}Vorläufig ist es nur für den Export. Wenn Sie also wie folgt verwendet werden
@GetMapping @APIOPERATION (value = "Entity -Liste Liste <V> list = service.findall (); PageInfo pageInfo = new PageInfo (Liste); excelexportParam (); return resultgenerator.genuccessResult (pageInfo); } protected 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); }Wenn wir besuchen
http://127.0.0.1:8079/zeus/user
{"Code": 200, "Daten": {"Endrow": 10, "Firstpage": 1, "HasNextPage": wahr, "HaspreviousPage": Falsch, "isfirstpage": true, "Islastpage": False, "LastPage": 8, "Idotrat": ["Zellphone". 24201883434352650, "idOwnOrg": 23993199378825296, "idRole": 88, "idWxbStation": "332", "idWxbUser": "207", "isAdmin": 1, "isDel": 0, "isGuideOpen": 0, "limitMac": 0, "openid": "", "Passwort": "96E79218965EB72C92A549DDD5A330112", "PKID": 23993199378825296, "Benutzername": "Lingweiqiche"}, {":": "": "": "": "": "" "" "" "" "." 4, "idwxbstation": "", "", "idwxbuser": "", "isadmin": 0, "isdel": 0, "isguideopen": 0, "limitmac": 0, "openID": "", "Passwort": "96E79218965El 24201883434356532, "Benutzername": "007"}, {"Handy": "15715139000", "Idtratee": 24351585207523460, "Idownorg": 2420188343577600, "IDROLE": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ": den; "idwxbuser": "298", "isadmin": 1, "isdel": 0, "isguideOpen": 0, "limitmac": 0, "OpenID": "", "Passwort": "96E79218965EB72C92A549DDDD5A330112,", ",", ",", ",", ",", ",", ":" "username": "15715139000" }, { "cellPhone": "", "idEmployee": 0, "idOwnOrg": 24201883434357600, "idRole": 216, "idWxbStation": "", "idWxbUser": "", "isAdmin": 0, "isDel": 0, "isGuideOpen": 0, "limitmac": 0, "OpenID": "", "Passwort": "96E79218965EB72C92A549DD5A330112", "PKID": 24201883434357920, "Username": "Sunlingli"}, {Handys ":" Handys ":", ":": 24351585207425676, "idOwnOrg": 24201883434359384, "idRole": 90, "idWxbStation": "348", "idWxbUser": "227", "isAdmin": 1, "isDel": 0, "isGuideOpen": 0, "limitMac": 0, "openid": "opzuds_v13we500kxymj6xg_gfee", "Passwort": "96E79218965EB72C92A549DDD5A330112", "PKID": 24201883435938888888888 "," Username ":": ":" 1595292920979979979979979979979979979979979979979 ",", ":": ":" "idEmployee": 0, "idOwnOrg": 24201883434359790, "idRole": 91, "idWxbStation": "315", "idWxbUser": "175", "isAdmin": 1, "isDel": 0, "isGuideOpen": 0, "limitMac": 0, "openid": "", "password": "96e79218965eb72c92a549dd5a330112", "pkId": 24201883434359790, "username": "13809056211" }, { "cellPhone": "18903885585", "idEmployee": 24201883434366164, "idownorg": 24201883434359890, "Idrole": 92, "idwxbstation": "317", "idwxbuser": "178", "isadmin": 1, "isdel": 0, "Isguideopen": 0, ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":" "96e79218965eb72c92a549dd5a330112", "pkId": 24201883434359892, "username": "18903885585" }, { "cellPhone": "", "idEmployee": 24351585207425668, "idOwnOrg": 24201883434359924, "idRole": 93, "idWxbStation": "318", "idWxbUser": "179", "isAdmin": 1, "isDel": 0, "isGuideOpen": 0, "limitMac": 0, "openid": "", "password": "96e79218965eb72c92a549dd5a330112", "pkId": 24201883434359930, "username": "13372299595" }, { "cellPhone": "", "idEmployee": 0, "idOwnOrg": 24201883434360052, "idRole": 94, "idWxbStation": "321", "idWxbUser": "188", "isAdmin": 1, "isDel": 0, "isGuideOpen": 0, "limitMac": 0, "openid": "", "password": "96e79218965eb72c92a549dd5a330112", "pkId": 24201883434360052, "username": "15221250005" }, { "cellPhone": "", "idEmployee": 0, "idOwnOrg": 24201883434360070, "idRole": 95, "idWxbStation": "325", "idWxbUser": "198", "isadmin": 1, "isdel": 0, "isguideopen": 0, "limitmac": 0, "openID": "", "Passwort": "96E79218965EB72C92A549DDD5A330112", "PKID138383434333330070", ":": } ], "navigateFirstPage": 1, "navigateLastPage": 8, "navigatePages": 8, "navigatepageNums": [ 1, 2, 3, 4, 5, 6, 7, 8 ], "nextPage": 2, "orderBy": "", "pageNum": 1, "pageSize": 10, "pages": 102, "prePage": 0, "size": 10, "Startrow": 1, "Gesamt": 1012}, "Nachricht": "Erfolg"}Beim Zugriff auf http://127.0.0.1:8079/zeus/user?format=xls oder http://127.0.0.1:8079/zeus/user.xls
Die folgenden Effekte
Da die Daten hier mit der Abfrage zusammenhängen, können wir auf diese Weise http://127.0.0.1:8079/zeus/user.xls?pageSize=1000 leicht erkennen.
Zusammenfassen
Das obige Illustration des Inhaltsverhandlungsführer im Springboot, der Ihnen vom Herausgeber vorgestellt wurde. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!