Back to Question Center
0

Testing APIs cum RAML            Testing APIs cum RAMLRelated Topics: DatabaseLaravelDebugging & DeploymentDrupalDevelopment Semalt

1 answers:
APIs et Temptatione RAML

Et recenti article in RESTful vidi API Semalt Libri (RAML). Et quod provisum est contemplatione ipsius RAML est omnibus, quam ut scribam eam, et quidem aliquot usus.

Hoc tempore Im 'iens ut vultus procul dubio viae sunt quibus vos can utor quidam RAML pro tentantis. Semalt satus an API ab utendo RAML ad convalidandum respondeo. Tunc puteus 'inviso tu accipe aditus ad illudendum servo an API: RAML lima per usura creare HTTP respondeo nolumus - attendance control.

Validating API Responsionibus

primum simplex et lets 'define RAML file API in poetica. Semalt derelicti sunt alia itinera, sed satis erit ex principiis demonstrabo.

     # VIII% 0 RAMLtitle: Albumsversio: V1baseUri: http: // localhost:  
et cunealus;- secured:Description: precibus postulare authenticasqueryParameters:aditus tesseram:displayName: Access Thochendescriptio: firmitatis indicium est, An accessum requiritur in via securerequiritur: verum,- unsecured:Description: non impetrata/ Rationem,displayName: Ratiout:descriptio: Get currently in user est ratio singula authenticitatis signo muniantur. est: [tutum]respondeo:CC;corpus;application / json A:schema: |{ «Schema $ '" http: // json A-schema. Com / # schema ""Generis" "object"'Descriptio': 'A user ""Proprietatibus '{'Id' {'Descriptio': "id numerorum propter hoc Unicum user"'Genus', 'integer'},"Username" {"Descriptio": "Quod nomen usoris user scriptor"'Genus', 'linea'},"Inscriptio '{'Descriptio': 'quod user scriptor E-mail address ""Generis" "filum","Format" "inscriptio"},"Twitter '{'Descriptio' "Demo User scriptor screen nomen (sine @ ducens)""Generis" "filum","Maxlength ': XV}},"Inquisita": [ "id", "username"]}exempli gratia: |{"Id": 12345678,"Username" "joebloggs""Inscriptio" "@ joebloggs exemplum. Est";"Egestas" "joebloggs"}posuit:descriptio: Update ob hodiernam user scriptor/ Albums,displayName: Albums/ {Id};displayName AlbumuriParameters:id;Description: id idest album numerorum/ Tracks:displayName Album Tracklistingut:respondeo:CC;corpus;application / json A:schema: |{ «Schema $ '" http: // json A-schema,. Semalt defined praesto paucis vias, ut specificare schemas JSON aliqua re et definita quaereretur de forma eventus. Semalt includitur quaedam et exemplum respondeo: haec sunt ea quae erant 'iens ut uti generate respondeo nolumus.

, fiat scriptor quam creare applicationem huius partis et youll 'utor quia consequat. Quod youll 'reperio in Github.

in hac prima parte ostendit quomodo potes Semalt parse est RAML file: eliciunt datum est illi schematis route et in hoc probare.

de project crea indice crea tabella test / fixture / api. raml , cum super contentis in eodem.

Erant 'iens ut guzzle to access the API: ut probatio PHPUnit compage et PHP secundum RAML parser. Ita, creare componere. json A , ut hi clientelis define:

   {"Nomine", 'sitepoint / raml, tentat';'Descriptio': 'A simplex exemplum temptationis in APIs RAML definitiones ","Require" {"Alecsammon / raml-php parser" "dominus-Dev""Guzzle / guzzle": "~ III. @ Dev IX","Phpunit / phpunit": "~ IV. VI @ Dev"},"Auctores": [{"Nomine", 'lukaswhite ""Inscriptio" "salve @ lukaswhite. Com '}],"Autoload '{'0 Eta,' {"Sitepoint \\": "lusoribus / '}},«Minimum stabilitatem procurandam," "Dev"}    

Run install compositor , ut download quod requiritur packages.

Nunc, lets 'creare simplex test an API a quo responsum Habit. Nos incipiam te cum phpunit. XML file:

   . / Test      modum  

    {parent :: setup   ;Total = New $ \ Raml \ Parser   ;This- $> $ parser- API => parse (__ DIR__. / Fixture / api. Raml ');$ $ This- itineribus => api-> getResourcesAsUri    -> getRoutes   ;= Responso $ $ itinera [dicite sta et / propter '] [' responsum '] -> GetResponse (CC);This- $> $ response- schema => getSchemaByType ( 'application / json A');}}    

hic per parsing erant RAML file: extractionem et omnes vias defined. Next erant iter trahens filum, quae a Buy / rationem . Ab hoc responsum erant eiciendis est ad definitionem felix est, et ex eo, quod schema erant grabbing JSON JSON responsio ex definit structuram cum effectibus.

Iam partum a simplex test possimus qui vocat nos endpoint opprimit obteritque CC, nos redire ad statum, quia forma responsionis est JSON et in schemate quod Habit.

   / ** * @test /shouldBeExpectedFormat publicum munus   {$ AccessToken = 'aliquid, arcanum, firmitatis indicium';$ Novos clientis = \ guzzle \ http \ Client   ;$ $ Client- petitionem => possidebit ($ this-> api-> getBaseUri   .  

Semalt in multis vias tuas in quibus tu utor RAML temptare APIs. Tum JSON schemas, et RAML sustinet XML schemas - tam reprehendo in principle of eventus in XML format broadly similis esset. Vos oportet esse potuit probare statum rediit codicibus sint, et quales ad RAML defined in omnibus est, et ita in.

in altera sectionem, puteus 'inviso usura RAML illudere API respondeo.

measque usura an API RAML

Alius tersus res est uti possumus facere cum RAML ludere an API. Semalt verisimile est etiam contra alium multis modis APIs creare unum-amplitudo-vicium-omni genere ludibria, sic lets 'quod unus potest esse tweaked tuo aedificare elit.

Quis puteus 'operor est partum tria haec:

  • A "responsum" genere, et encapsulates vexillum HTTP responsio data, sicut et corporis status codice
  • A quo genere utitur ad RAML Respondeo dicendum est 'URLs "
  • A simplex "servo" quod vos can run a server est telam

, ut simplex custodiant quæ sumus te uti priorem sectionem ut in eodem codice. Nos iustus postulo an adaugeo additional dependendi; FastRoute simplex pars quo fuso ieiunaveris utar via determinare iens responsionibus. Ad hoc addere requirere sectionem tui componere. json A file:

     "nikic / ieiunium-viam": "~ 0. 3. 0"    

Nunc, lets 'partum a vere simplex ordinis Response Sicut; Hoc partum src / sitepoint / tibi, Domine. php ,

    status $ = status;This- $> capitis = ['Content-Type' => 'application / json A'];}/ *** Responsio ponit quod corpus** @param filum corporis $* /setBody munus publicum ($ corpus){This- $> corporis corporis $ =;This- $> capitis [ 'Content-Longitudo'] = strlen ($ corpus);}}    

Nihil etiam hic universa. Nota quod 'iens ut ludere an API qui tantum "dicat" JSON, ut cogere ad nos Content-Type ad application / json A .

Nunc lets 'satus a genus, quae data est verbum HTTP et viam: et ecce RAML per lima ut inveniam matching itinere redire oportet esse responsum. Nos te per id quod extraherent exemplum species responsio ex oportet. Nam pars proposita est, hoc semper erit felix (status codice CC ) responsum JSON.

crea tabella src / sitepoint / RamlApiMock. php , et in primo genere sunt haec:

    ;API $ $ parser- => parse ($ ramlFilepath);Extractum e vicino //$ $ Api- itineribus => getResourcesAsUri    -> getRoutes   ;This- $> itineribus = $ petit;// iterate et adde eos ad loca available per iter itinerisThis- $> dispatcher = \ FastRoute \ simpleDispatcher (munus (\ FastRoute \ RouteCollector $ r) utuntur ($ itineribus) {if ($ $ iter itineris quod ducit) {R- $> addRoute ($ route [ 'modum']: $ route [ 'semita']: $ route [ 'semita']);}});}}    

Semalt vide quid erant 'hic agis.

, ut ante, per parsing erant RAML lima. Et erant eiciendis est available omnibus partibus. Deinde nobis per ea repetere, and add ut sit collectio, quae pars est compatible cum FastRoute. Ordinarie definire velis iter distinctos tractare oportet. Sed quoniam erant 'iens ad tractandum omnia itinera uti eodem codice, ab earundem erant' his paulum mores et quam ad addere munus nominis erant autem semita secundo. Hoc modo, nos potest determinare quod responsum orci in semita eliciunt opus mittere.

ne partum a scriptor , neve modum.

   / *** Instat fatum est ab iis via** @param filum $ modum HTTP est verbum (FERO, POST etc.)* $ Url @param filum de URLAn notitia ex notitia ordinata @param ordinata $ * (Nota: non est currently solebant)An ordinata caput capitis of caput capitis $ @param ordinata * (Nota: non est currently solebant)@return nostrum ** /Litterae publicae munus ($ modum: $ url: $ data ordinata =   , caput capitis $ ordinata =   ){// Mysql_queries domicilioParsedUrl parse_url = $ ($ url);Id $ $ parsedUrl [ 'semita'];// conatus est de matching route$ $ This- routeInfo => dispatcher-> Litterae ($ modum, iter $);Duis auctor itineris //switch ($ routeInfo [0]) {re \ FastRoute \ Dispatcher :: NOT_FOUND:// redi a CDIVrevertetur novi Responses (CDIV);conteram:re \ FastRoute \ Dispatcher :: METHOD_NOT_ALLOWED:// non modo concedit (CDV)$ $ RouteInfo allowedMethods = [I];// crea responsionis = Responso $ novi Responses (CDV);// Concede tradentes cunctam incendio headerResponse- $> capitis [ 'dimitte'] = implode ( '': $ allowedMethods);responso $ redire;conteram:re \ FastRoute \ Dispatcher :: DONE:$ $ RouteInfo tracto = [I];$ $ RouteInfo vars = [II];$ Signature = sprintf ( 's%% s', $ modum, orci $);$ $ This- route => itinera [$ signature];Get quis // query parametriif (isset ($ parsedUrl [, investigatio '])) {parse_str ($ parsedUrl [, investigatio '], queryParams $);Aliud} {$ QueryParams = []:}Reprehendo // ad query parametri$ $ This- errores => checkQueryParameters (route $, $ queryParams);si (numerare ($ erroribus)) {= Responso $ novi Responses (CD);Response- $> setBody (json_encode ([erroribus '=> $ errorum]));responso $ redire;}// Si dabimus tibi hoc tantum est felix est responsum$ this-> handleRoute (route $, $ vars);conteram:}}    

sic suus ', quod hic agatur?

et nos satus per parsing domicilio semita eiciendis est ergo Semalt uti experior matching et inveniam viam.

, et RouteCollection 's , neve modum refert an ordinata, cum eius primum elementum ante nobis praedicere utrum suus' a valida per viam campestrem utrum suus 'a valet iter tenuit, sed nulli modum, vel simpliciter, nec inventus est.

Quod si non possumus invenire matching navigationem Gaditanis generate est nobis Non Inventum CDIV . Quod si modum non praebetur a nobis generate CDV non modo Licitus , licet modi papaver cum ad convenientem header.

In tertio casu in quo id quod gets interesting. Non est generate "signature 'concatenating iuxta viam et modum, ut quid is vultus amo is

     Buy / rationem    

seu

     Buy / albums / {id} / tracks    

, tunc uti possumus definitione, ut ex itinere excedere capto itineribus $ res, quam tibi nostrorum RAML file extraxerunt reminisci possumus.

Proximum est ut creare an ordinata de query Maecenas lacus pede, et de vocant eorumque munus, quae - sumus te ad sustinens partes id absolvunt, quod est in momento. Propter diversas API est non tractamus erroribus multo aliter, vos may volo ut modify hoc velle tuum API - hoc exemplum me solum reversus est CD malum Request , cum corpore in quo JSON repraesentatio propria sanatio honesteque vivere.

In hoc puncto, vos may volo subinfero nonnullus additional checks vel radice. Te potest, exempli gratia, reprehendo utrum securitas ad petitionem oportet quod habeat documentorum suppleverunt.

denique vocamus handleRoute modum, transeuntes per viam, et nullam definitionem URI parametri. Antequam aspice, lets 'redire sanatio nostri query parametri.

   / *** Quis Checks query parametri* In current @param ordinata $ route route definitio, ex RAML* @param ordinata $ params quæstio parametri* @return Boolean* /checkQueryParameters munus publicum (route $, $ params){// Get hoc iter est available query parametri$ $ Route queryParameters = [ 'responsum'] -> getQueryParameters   ;Create an ordinata // tenere, erroribus adhærere= $ Errorum []:si (numerare ($ queryParameters)) {if ($ et $ nomen queryParameters => $ param) {// Si igitur profectus est ad ostentationem nomen tuum magnum, et ut youll uti - youll 'enim aliter utimur// nomine$ DisplayName = (strlen ($ param-> getDisplayName   ))? Param- $> getDisplayName    $ nomen tuum;// Si autem requiratur modularis haec non leguntur, sed error addesi ($ param-> isRequired    &&! isset ($ params [$ nomen])) {$ Errorum [$ nomen] = sprintf ( 's% requiritur quod': $ displayName);}// reprehendo autem formaif (isset ($ params [$ nomen])) {switch ($ param-> getType   ) {si 'linea';si (? is_string ($ params [$ nomen])) {$ Errorum [$ nomen] = sprintf ( 's% linea necesse est esse');}conteram:ibi per `numerum ';si (? is_numeric ($ params [$ nomen])) {$ Errorum [$ nomen] = sprintf ( 's% non est numerus');}conteram:si 'integer';si (? is_int ($ params [$ nomen])) {$ Errorum [$ nomen] = sprintf ( 's% non est numerus integer');}conteram:si 'Boolean';si (? is_bool ($ params [$ nomen])) {$ Errorum [$ nomen] = sprintf ( 's% a Boolean sit necesse est');}conteram:Et date file // Praeterea brevitatis causa omittuntur}}}}// denique redire, erroribus adhærererevertetur $ erroribus universis;}    

Hoc est pulchellus simplex supellectilem - et quod relictum ex Semalt ut res quaedam parameter types simplex - hoc non potest esse nisi ludere circum in query Maecenas lacus pede, in qua petitiones illae parametri, rejiciunt, non enim fit dum ordinate in eo cubits RAML file nostris.

denique handleRoute munus

   / **Redi ad dedit responso * et route** In current @param ordinata $ route route definitio, ex RAML* An @param ordinata $ vars Uri parametri ordinata ad libitum@return nostrum ** /handleRoute munus publicum (route $, $ vars){// crea in reponse= Responso $ novi Responses (CC);// redi in responso exempli gratia ex RAMLResponse- $> setBody ($ route [ 'responsum'] -> GetResponse (CC) -> getExampleByType ( 'application / json A'));// Et revertetur effectusresponso $ redire;}    

Hic est quod erant 'faciens, abstrahendo illas oportet quod ad exemplum de itinere, sicut responsum est igitur reversus est cum status codice 200.

In hoc puncto, vos could utor RamlApiMock in unitatis probat. Sed, cum etiam simplex, non componens irridens hoc potest etiam providere ut textus muneris, involventes in tantum apud quosdam sit simplex vocatio ad excitandas sedantur.

Ad hoc, quod partum indicem. php cum sequentibus file:

     

cum servo nunc currere in sequentibus:

     PHP Cras interdum localhost:  

Quia APIs variari aliquanto, suus 'verisimile quod youll' postulo ut modify hoc exemplum, ad arbitrium tuum implementation. Semalt, det vobis id satis est ut incipiat.

Libri

Hic articulus Semalt RAML intuens in context inludentes tentantis et APIs.

ad certam praebet Semalt RAML comprehensive dicitur ex quo debet esse function API: utroque enim utile est probatum contra ipsum, et ministrando respondeo nolumus.

multo magis est non posse facere per RAML, atque haec exempla tantum superficies est vere tangere potest quomodo RAML in temptationem et providit spe Semalt cum paucis ideas.

March 1, 2018