背景
これらのニーズをエクスポートするためにRestful Instinctを使用している友人は拒否されます〜それは、Restful URLの一貫性を破壊します[厳密な修正はHTTP JSONまたはRESTFULのいずれかです。多くの友人がJSONを公開し、それを直接安らかに呼ぶでしょう]
上記のコードジェネレーターと同様に、バッチは大量のコードを生成します。そのほとんどはレストコントローラーです。
パブリックアブストラクトクラスAbstractrestController <v extends vo、s extends so、pk extends serializable> {protected class <v> voclazz; @Autowiredプライベートサービス<V、S、PK>サービス; public abstractrestController(){typetoken <v> votype = new Typetoken <v>(getClass()){}; voclazz =(class <v>)votype.getRawType(); } @postmapping()@apioperation(value = "new Entity"、notes = "")public result add(@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 = "update entity"、notes = "")public result update(@requestbody v vo){service.updatebyprimarykeyselective(vo); return resultgenerator.gensuccessResult(); } @getMapping @Apioperation(value = "get entity list"、notes = "")public result list(s so){pagehelper.startpage(so.getCurrentPage()、so.getPagesize());リスト<v> list = service.findall(); pageinfo pageinfo = new PageInfo(list); 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.setexporms(ep); param.setFileName( "file.xls"); f6static.setexcelExportparam(param); } @getMapping( "/{id}")@apioperation(value = "get single entity"、notes = "")public result detail( @pathvariable pk id){v vo = service.findbyid(id); return resultgenerator.gensuccessResult(vo); } @deletemapping( "/batch")@apioperation(value = "batch delete entity"、notes = "")public result batchdelete(@requestparam string ids){service.deletebyids(ids); return resultgenerator.gensuccessResult(); } @getMapping( "/batch")@apioperation(value = "batch get entity"、notes = "")public result batchdetail(@requestparam string ids){list <v> vos = service.findbyids(ids); return resultgenerator.gensuccessResult(vos); } @PostMapping( "/batch")@apioperation(value = "batch new Entity"、notes = "")public result add(@requestbody list <vos){service.save(vos); return resultgenerator.gensuccessResult(); } @getMapping( "/count")@apioperation(value = "Entitiesの数を取得、notes =" ")public result count(@requestbody v v){int count = service.selectcount(v); return resultgenerator.gensuccessResult(count); }では、エクスポートする方法は? [実際、エクスポートはデータの表示であると理解できますが、結果はJSONだけではありません]
質問が提起された場合、ログインするのはどうですか?従来のソリューションはログインログアウトです。では、Restful Resourcesを置き換えるというアイデアは何ですか?
ヒント:ログインは新しいセッションです。ログアウトは削除セッションです。
成し遂げる
上記のアイデアに基づいて、私たちは当然、複数の結果を同じURLに返すだけでいいと思っていましたが、大丈夫ではありませんか? [PDF、1つのバージョン、1つのバージョン、1つのバージョン、1つのバージョン、1つのバージョン、1つのバージョン]
ビンゴ!これがコンテンツネゴシエーターの起源です
コンテンツネゴシエーターは春までに作成されていません。実際、これはHTTPヘッダーから見ることができます。
1.たとえば、英語の顧客に英語のページに戻ることは、中国のページには多すぎます。
HTTPプロトコルは、クライアントが各設定カテゴリの複数のオプションをリストし、各優先オプションの優先順位を関連付けることができる品質値(Q値と呼ばれる)を定義します。
Accept-Language: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。その後、Accept-Headerなどの他のパラメーターがいくつかあります
通常、コンテンツネゴシエーターには最初に次のソリューションがあります
1.ヘッダーを受け入れる:
これは教科書でよく説明されています。理想的には、この方法が最適ですが、ブラウザ(つまり、HTMLディスプレイ)を介してリソースに直接アクセスする場合、ブラウザの違いにより、送信されるヘッダーヘッダーは異なります。これにより、サーバーはどの形式のデータがお客様に返されるかわかりません。以下は、ブラウザの受け入れヘッダーです
Chrome:Accept:Application/XML、Application/XHTML+XML、TEXTML; Q = 0.9、TEXT/PLAIN; Q = 0.8、IMAGE/PNG、*/*; Q = 0.5 Firefox:Accept/Html、Application/XHTML+XML、Application/XML; Q = 0.9、Image/Gif:0.8 IE8:0.8; Q = 0.8 IE8: 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が失われましたが、この方法は、プログラマーの美的ビューに沿っているため、実際の環境で最も使用されます。
たとえば、 /user.json /user.xls /user.xml
パラメーターを使用する現在、多くのオープンAPIがこの方法を使用しています。
ただし、さまざまなブラウザーの場合、Accept-Headerが特に統一されていない場合があるため、多くの実装は2 3 2つのソリューションを選択します。
春に上記の2つのソリューションを採用します
最初にコンテンツネゴシエーターを構成します
コード
@Bean Public Resolver ContentNegotiatingViewResolver(ContentNegotiationManager Manager){//ビューResolsivers viedResolver beannameViewResolver = new BeanNameViewResolver(); List <ViedResolver> Resolvers = lists.NewArrayList(BeanNameViewResolver); ContentNegotiatingViewResolver Resolver = new ContentNegotiatingViewResolver(); Resolver.setViewResolvers(Resolvers); Resolver.setContentNegotiationManager(マネージャー);リゾルバーを返します。 } @Override public void configurecontentnegotiation(contentnegotiationConfigurer configure){configurer.favorpathextension(true).usejaf(false).favorparameter( "format").ignoreacceptheader(true).defaultttype(mediaTtype .mediatype( "json"、mediatype.application_json).mediatype( "xls"、excel_media_type); }対応するコンバーターを作成します
private httpmessageconverter <object> createexcelhttpmessageconverter(){excelhttpmessageconverter excelhttpmessageconverter = new excelhttpmessageconverter(); excelhttpmessageconverterを返します。 }Easy-POIを使用してデータを直接エクスポートします
/ * * Copyright(c)2017。LoremIpsum dolor sit amet、consceTur adipiscing Elit。 * Morbi Non Lorem Porttitor Neque Feugiat Blandit。 ut vitae ipsum eget quam lacinia accumsan。 * etiam sed turpis ac ipsum condimentum fringilla。 Maecenas Magna。 * proin dapibus sapien vel ante。 Aliquam Erat Volutpat。 Pellentesque Sagittis Ligula Eget Metus。 *前庭のコモド。 ut rhoncus gravida arcu。 */パッケージcom.f6car.base.web.converter; cn.afterturn.easypoi.excel.excelExportutilをインポートします。 com.f6car.base.common.resultをインポートします。 com.f6car.base.core.excelexportをインポートします。 com.f6car.base.core.excelexpormparamをインポートします。 com.github.pagehelper.pageinfoをインポートします。 com.google.common.collect.listsをインポートします。 Import org.apache.poi.ss.s.usermodel.workbook; Import org.springframework.http.httpheaders; Import org.springframework.http.httpinputmessage; org.springframework.http.httpoutputmessageをインポートします。 org.springframework.http.mediatypeをインポートします。 Import org.springframework.http.converter.abstracthttpmessageconverter; Import org.springframework.http.converter.generichttpmessageconverter; Import org.springframework.http.converter.httpmessagenotreadableException; Import org.springframework.http.converter.httpmessagenotwritexception; java.io.ioexceptionをインポートします。 java.lang.reflt.typeをインポートします。 java.net.urlencoderをインポートします。 java.util.collectionをインポートします。 java.util.collectionsをインポートします。 java.util.collectionsをインポートします。 java.util.mapをインポートします。 static com.f6car.base.core.f6static.getexcelexparamをインポートします。 / ** * @author qixiaobo */ public class excelhttpmessageconverterは、abstracthttpmessageconverter <object> endly expenting generichtttpmessageconverter <object> {public static final mediatype excel_media_type = new mediatype( "vnd.md.md.ms-ex)を実装しています。 public excelhttpmessageconverter(){super(excel_media_type); } @Override Protected Boolean Supports(class <?> clazz){return false; } @OverrideプロテクションオブジェクトReadInternal(class <?> clazz、httpinputmessage inputmessage)IoException、httpmessagenotreadableexception {return null; } @Override Protected void write internal(Object o、httpoutputmessage outputmessage)IoException、httpmessagenotwritexception {httpheaders headers = outputmessage.getheaders();収集データ= getActualData((result)o); excelexportparam excelexpormparam = getExcelExportparam();ワークブックワークブック。 switch(excelexporam.getExcelExport()){case remormexcel:workbook = exclexportutil.exportexcel(exclexportparam.getExporams()、(class <?>)excelexporam.getclazz()、(collection <?>)data);壊す;ケースMapExcel:workbook = excelexportutil.exportexcel(exclexportparam.getExpormparams()、exchelexportparam.getexcelExportentities()、(collection <?extends map <?、?>>)データ);壊す;ケースBigExcel:case mapexcelgraph:case pdftemplate:case templateexcel:case templateword:default:throw new runtimexception(); } if(workbook!= null){if(excelexporm.getFileName()!= null){string codedfileName = urlencoder.encode(excelexportparam.getFileName()、 "utf8"); headers.setContentDispositionFormData( "Attachment"、CodedFileName); } workbook.write(outputmessage.getBody()); }}プライベートコレクションgetActualData(result r){if(r!= null && r.getdata()!= null){object data = r.getdata(); if(data instanceof pageinfo){return((pageinfo)data).getList(); } else if(!(data instanceof collection)){data = lists.newarrayList(data); } else {return(collection)data; }} return collections.emptylist(); } @Override public boolean canread(タイプタイプ、クラス<?> contextclass、mediatype mediatype){// excel 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 = getExcelExpormParam(); if(param == null || param.getExcelExport()== null || param.getExporams()== null){return false; } if(param.getExcelExport()== excelexport.normalexcel){return true; } else {logger.warn(param.getExcelExport() + "今すぐサポートしない!"); falseを返します。 }} @Override public void write(オブジェクトo、タイプタイプ、mediatype contenttype、httpoutputmessage outputmessage)は、ioexception、httpmessagenotwritexception {super.write(o、contenttype、outputmessage)をスローします。 }}とりあえず、それは輸出のためだけなので、次のように使用する場合
@getMapping @Apioperation(value = "get entity list"、notes = "")public result list(s so){pagehelper.startpage(so.getCurrentPage()、so.getPagesize());リスト<v> list = service.findall(); pageinfo pageinfo = new PageInfo(list); 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.setexporms(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、 "true、" islastpage ":fals、" lastpage ":8、" list ":[{" 13845555552 "" 24201883434352650、 "idownorg":2399319937825296、 "idrole":88、 "idwxbStation": "332"、 "idwxbuser": "207"、 "isadmin":1、 "": ""、 "パスワード": "96E79218965EB72C92A549DD5A330112"、 "PKID":23993199378825296、 "username": "lingweiqiche"}、{":" ":" Idployee 4、 "idwxbstation": "" ""、 "、"、 "idwxbuser": "" "、" isadmin ":0、" isdel ":0、" isguideopen ":0、limitmac":0、 "、"、 "、" openid " 24201883434356532、 "username": "007"}、{"携帯電話": "15715139000"、 "idemployee":24351585207523460、 "idownorg":24201883434357600、 "Idrole":89、 "idrole" "idwxbuser": "298"、 "isadmin":1、 "isdel":0、 "isguideopen":0、 "limitmac":0、 "openid": ""、 "password": "96e79218965eb72c92a549d5a3301333012" "username": "15715139000"}、{"携帯電話": "" "、" idemployee ":0、" idownorg ":24201883434357600、" idrole ":216、" idwxbstation ":" "" "、" idwxbuser ":" ":" "": " "isguideopen":0、 "limitmac":0、 "openid": "" "、"パスワード ":" 96e79218965eb72c92a549ddd5a330112 "、" pkid ":2420188343434357920、" "" "" "" "" "": "" ":" "" ":" "": "" ":" "" ":" "": "" ":" "": "" "" "" "" "" "" "" "" Id "" "" "" Id " 24351585207425676、 "idownorg":24201883434359384、 "idrole":90、 "idwxbstation": "348"、 "idwxbuser": "227"、 "isadmin":1、 "" ":0、" "" ": "opzuds_v13we500kxymj6xg_gfee"、 "password": "96e79218965eb72c92a549ddd5a330112"、 "pkid":24201883434359388、 "username": "15952920979" "" ":" 「Idemployeee」:0、 "idownorg":2420188343434359790、 "idrole":91、 "idwxbStation": "315"、 "idwxbuser": "175"、 "isadmin":1、 "isdel":0: "" "": "" ":0:" "": "" ":" ":" "": "": "": "" ":" ":" "": "": "" "": "96E79218965EB72C92A549DD5A330112"、 "pkid":2420188343434359790、 "username": "13809056211"}、{"folphone": "18903885585" "idownorg":24201883434359890、 "idrole":92、 "idwxbstation": "317"、 "idwxbuser": "178"、 "isadmin":1、 "isdel":0、 "isguideopen":0、 "": " "96E79218965EB72C92A549DD5A330112"、 "pkid":2420188343434359892、 "username": "18903885585"}、{"folphone": "": "Idmploplypoliply 242018834343435924、 "idrole":93、 "idwxbstation": "318"、 "idwxbuser": "179"、 "isadmin":1、 "isdel":0、 "isguideopen":0、 "limitmac":0、 "" "" "" "" "" "": "96E79218965EB72C92A549DD5A330112"、 "pkid":2420188343434359930、 "username": "13372299595"}、{"folphone": "" "、" ":0、" Idownorg ":222018336833683368368336 "idrole":94、 "idwxbstation": "321"、 "idwxbuser": "188"、 "isadmin":1、 "isdel":0、 "isguideopen":0、 "limitmac":0、 "openid": ""、 "パスワード": "96E79218965EB72C92A549DD5A330112"、 "pkid":2420188343434360052、 "username": "15221250005"} "idrole":95、 "idwxbstation": "325"、 "idwxbuser": "198"、 "isadmin":1、 "isdel":0、 "isguideopen":0、 "limitmac":0、 "openid": ""、 "password": " "pkid":24201883434360070、 "username": "13837251167"}]、 "NavigateFirstPage":1、 "NavigateLastPage":8、 "NavigatePages":8、 "NavigatePagenums":[1、3、4、5、7、8、8]: ":8、" "、" Pagenum ":1、" Pagesize ":10、" Pages ":102、" prepase ":0、" size ":10、" Startrow ":1、" Total ":1012}、" Message ":" success "}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を簡単に実現します!
要約します
上記は、編集者が紹介したスプリングブートのコンテンツネゴシエーターのイラストです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!