package Ġcom . ang cy o . u iv iew . less Ċ Ċ import Ġandroid . text . TextUtils Ċ import Ġcom . ang cy o . http . Cache Adapter Ċ import Ġcom . ang cy o . http . Cache Interceptor Ċ import Ġcom . ang cy o . lib . L Ċ import Ġcom . ang cy o . u iv iew . less . Offline Cache Adapter . Companion . ENTRY _ BODY Ċ import Ġcom . ang cy o . u iv iew . less . Offline Cache Adapter . Companion . ENTRY _ METADATA Ċ import Ġcom . ang cy o . u iv iew . less . kotlin . app Ċ import Ġcom . ang cy o . u iv iew . less . kotlin . pattern Ċ import Ġcom . ang cy o . u iv iew . less . kotlin . readString Ċ import Ġcom . ang cy o . u iv iew . less . utils . R CacheManager Ċ import Ġcom . ang cy o . u iv iew . less . utils . R LogFile Ċ import Ġcom . ang cy o . u iv iew . less . utils . R Network Ċ import Ġcom . ang cy o . u iv iew . less . utils . Root Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType OrNull Ċ import Ġokhttp 3 . internal . cache . Disk L ru Cache Ċ import Ġokhttp 3 . internal . io . FileSystem Ċ import Ġok io .* Ċ import Ġok io . ByteString . Companion . encode Utf 8 Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠEmail : ang cy o @ 1 2 6 . com Ċ Ġ* Ġ@ author Ġang cy o Ċ Ġ* Ġ@ date Ġ 2 0 1 9 / 0 7 / 2 4 Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠSh en Z hen ĠO & M ĠCloud ĠCo ., ĠLtd . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ open Ġclass ĠOff line Cache Adapter ( cache Folder : ĠString Ġ= ĠRoot . getApp External Folder (" http _ cache ")) Ġ: ĊĠĠĠ ĠCache Adapter () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠVERSION Ġ= Ġ 2 0 1 1 0 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEN TRY _ METADATA Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEN TRY _ BODY Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEN TRY _ COUNT Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ/** éľĢè¦ģ å¿½ çķ¥ ç¼ĵåŃĺ çļĦ url æŃ£ åĪĻ */ ĊĠĠĠĠĠĠĠ Ġval ĠIG NORE _ URL _ P ATTER NS Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcache : ĠDisk L ru Cache Ġ= ĠDisk L ru Cache . create ( ĊĠĠĠĠĠĠĠ ĠFileSystem . SYSTEM , ĊĠĠĠĠĠĠĠ ĠFile ( cache Folder ), ĊĠĠĠĠĠĠĠ ĠVERSION , ĊĠĠĠĠĠĠĠ ĠEN TRY _ COUNT , Ġ 5 0 0 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 L ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġvar Ġcache Adapter Listener Ġ= ĠOff line Cache Adapter Listener () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠR CacheManager . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Cache Path ( cache Folder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck Need Cache ( request : ĠRequest ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcache . initialize () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( R Network . is Connect ( app ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( IGNORE _ URL _ P ATTER NS . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . url . toString (). pattern ( IGNORE _ URL _ P ATTER NS , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Force Cache ( request )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// é»ĺè®¤ ä¸į å¼ĢåĲ¯ ç¼ĵåŃĺ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse // is Json Type ( request ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** è¯»åıĸ ç¼ĵåŃĺ */ ĊĠĠĠ Ġoverride Ġfun Ġload Cache ( request : ĠRequest ): ĠResponse ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Force Cache ( request )) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is Json Type ( request )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcache Adapter Listener . key ( request ) ĊĊĠĠĠĠĠĠĠ Ġload Cache ( key )?. let Ġ{ Ġsnapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL . i (" è¯»åıĸ ç¼ĵåŃĺ :$ key :${ cache Adapter Listener . key Url ( request )} ". apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR LogFile . log (" http ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġrequest . headers ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġrequest . body ?. contentType ()?. toString () Ġ?: Ġ" application / json " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Length Ġ= Ġsnapshot . getLength ( ENTRY _ METADATA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Request Ġ= Ġrequest . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponse . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. request ( cache Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. protocol ( Protocol . HTTP _ 1 _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message (" ç¦» çº¿ æķ°æį® è¯»åıĸ æĪĲåĬŁ .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. headers ( headers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( Cache ResponseBody ( snapshot , ĠcontentType , Ġ"$ content Length ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠL . i (" æĹł ç¼ĵåŃĺ :$ key :${ cache Adapter Listener . key Url ( request )} ". apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR LogFile . log (" http ", Ġthis ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Cache ( key : ĠString ): ĠDisk L ru Cache . Snapshot ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot : ĠDisk L ru Cache . Snapshot ? ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot Ġ= Ġcache . get ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snapshot Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGive Ġup Ġbecause Ġthe Ġcache Ġcannot Ġbe Ġread . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsnapshot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Cache Json ( key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot : ĠDisk L ru Cache . Snapshot ? ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot Ġ= Ġcache . get ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snapshot Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGive Ġup Ġbecause Ġthe Ġcache Ġcannot Ġbe Ġread . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsnapshot . readString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ä¿ĿåŃĺ ç¼ĵåŃĺ æķ°æį® */ ĊĠĠĠ Ġoverride Ġfun Ġsave Cache ( request : ĠRequest , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Force Cache ( request ) Ġ|| Ġis Json Type ( request )) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresponse . body ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcache Adapter Listener . key ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Cache ( key , Ġit . source (). buffer . clone (), Ġit . content Length ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . flush () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠL . i (" ä¿ĿåŃĺ ç¼ĵåŃĺ :$ key :${ cache Adapter Listener . key Url ( request )} ". apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR LogFile . log (" http ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Cache ( key : ĠString , Ġjson : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( json Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠBuffer (). writeString ( json , ĠChar sets . UTF _ 8 ) ĊĊĠĠĠĠĠĠĠ Ġsave Cache ( key , Ġbuffer , Ġbuffer . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Cache ( key : ĠString , Ġbuffer : ĠBuffer , Ġbyte Count : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġeditor : ĠDisk L ru Cache . Editor ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor Ġ= Ġcache . edit ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( editor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . new Sink ( ENTRY _ METADATA ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( buffer , Ġbyte Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . commit () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor ?. abort () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhave Cache ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġload Cache Json ( key ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** åıª ç¼ĵåŃĺ json è¯·æ±Ĥ æķ°æį® */ ĊĠĠĠ Ġprivate Ġfun Ġis Json Type ( request : ĠRequest ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Json Type Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrequest . body ?. contentType ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . toString (). contains (" application / json ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Json Type Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Json Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** å¼º åĪ¶ ä½¿çĶ¨ ç¼ĵåŃĺ */ ĊĠĠĠ Ġprivate Ġfun Ġis Force Cache ( request : ĠRequest ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// æŃ¤ è¯·æ±Ĥ , Ġæĺ¯åĲ¦ éľĢè¦ģ ç¼ĵåŃĺ ĊĠĠĠĠĠĠĠ Ġvar Ġcache Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Url ä¸Ń , Ġ åĮħåĲ« äºĨ ç¦» çº¿ ç¼ĵåŃĺ åıĤæķ° ĊĠĠĠĠĠĠĠ Ġcache Ġ= Ġrequest . url . query Parameter ( Cache Interceptor . OFF LINE _ CACHE ) Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrequest . header ( Cache Interceptor . HEADER _ FORCE _ CACHE )?. isNotEmpty () Ġ== Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠCache Interceptor ?. get Offline Cache Adapter (): ĠOff line Cache Adapter ? Ġ{ ĊĠĠĠ Ġthis ?. cache Adapter ?. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠOff line Cache Adapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ fun ĠDisk L ru Cache . Snapshot ?. readString ( charset Name : ĠString Ġ= Ġ" UTF - 8 "): ĠString ? Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcontent Length Ġ= Ġthis . getLength ( ENTRY _ METADATA ) ĊĠĠĠ Ġreturn ĠCache ResponseBody ( ĊĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠ Ġ" application / json ", ĊĠĠĠĠĠĠĠ Ġ"$ content Length " ĊĠĠĠ Ġ). readString ( charset Name ) Ċ } Ċ Ċ class ĠCache ResponseBody Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġsnapshot : ĠDisk L ru Cache . Snapshot , ĊĠĠĠ Ġval ĠcontentType : ĠString ?, ĊĠĠĠ Ġval Ġcontent Length : ĠString ? Ċ ) Ġ: ĠResponse Body () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbody Source : ĠBuffered Source ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġsnapshot . getSource ( ENTRY _ BODY ) ĊĠĠĠĠĠĠĠ Ġbody Source Ġ= Ġobject Ġ: ĠForward ing Source ( source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. buffer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠcontentType (): ĠMediaType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠcontentType ?. to MediaType OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontent Length (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( content Length Ġ!= Ġnull ) Ġjava . lang . Long . parse Long ( content Length ) Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsource (): ĠBuffered Source Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbody Source ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠOff line Cache Adapter Listener Ġ{ ĊĊĠĠĠ Ġ/** è¯·æ±Ĥ å¯¹åºĶçļĦ url åľ°åĿĢ , Ġbody åıĤæķ° ä¼ļ åľ¨ url ? åĲİ éĿ¢ */ ĊĠĠĠ Ġopen Ġfun Ġkey Url ( request : ĠRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġrequest . url ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġrequest . body ?. readString () ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Url ("$ url ", Ġparams Ġ?: Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** è¯·æ±Ĥ å¯¹åºĶçļĦ url åľ°åĿĢ , Ġbody åıĤæķ° ä¼ļ åľ¨ url ? åĲİ éĿ¢ */ ĊĠĠĠ Ġopen Ġfun Ġkey Url ( url : ĠString , Ġjson Body : ĠString ? Ġ= Ġ"") : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( TextUtils . isEmpty ( json Body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ url ?$ json Body " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġkey ( request : ĠRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġrequest . url ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġrequest . body ?. readString () ĊĠĠĠĠĠĠĠ Ġreturn Ġkey ("$ url ", Ġ"$ params ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** è®¡ç®Ĺ url å¯¹åºĶçļĦ key åĢ¼ */ ĊĠĠĠ Ġopen Ġfun Ġkey ( url : ĠString , Ġjson Body : ĠString ? Ġ= Ġ"") : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Url ( url , Ġjson Body ). encode Utf 8 (). md 5 (). hex () ĊĠĠĠ Ġ} Ċ }