हम Scala पर सबसे सरल REST वेब सेवा लिखते हैं

मेरे पास Node.js में लिखी गई साइट है, और कभी-कभी मुझे वहाँ कुछ करने की आवश्यकता होती है जिसके लिए Node.js का इरादा नहीं है : उदाहरण के लिए, कुछ गणितीय गणनाएँ करने के लिए।

इस उदाहरण में, हम पासवर्ड हैश की गणना करेंगे।

आइए इस कार्य को "प्रोग्रामिंग के लिए उपयुक्त" (बैक्यूट) में लिखा गया है जो कार्यात्मक प्रोग्रामिंग भाषा है। उदाहरण के लिए, स्काला पर। कार्यात्मक रूप से, यह इस तरह होगा: Node.js हैशिंग के लिए "बैकएंड" के लिए एक हैश अनुरोध भेजता है, "बैकएंड" सोचता है और सोचता है और जवाब में गणना की गई हैश को Json प्रारूप में भेजता है। सामान्य HTTP अनुरोध-प्रतिक्रिया, कुछ भी जटिल नहीं है।

उपकरण


"फ्रेमवर्क" का एक सेट चुनने के मामले में समस्या को हल करने के लिए कई दृष्टिकोण हैं।

मैंने रूबी में थोड़ा लिखा ("रेल्स पर नहीं"), खुशी के साथ सिनात्रा फ्रेमवर्क का उपयोग करते हुए। और Node.js पर मैं एक्सप्रेस नाम के एक सिनात्रा क्लोन का उपयोग करता हूं। यह पता चला कि स्काला ने संगत क्लोन - स्कैलट्रा भी लिखा था। हम इसका उपयोग करेंगे।

स्काला के लिए लोकप्रिय आराम "रूपरेखा"


स्काला के लिए कई मान्यता प्राप्त हल्के रेस्ट फ्रेमवर्क भी हैं:



ये "फ्रेमवर्क" मुझे टिप्पणियों में उपयोगकर्ता btd द्वारा सुझाए गए थे। हालाँकि, मैंने उनमें से किसी को भी पसंद नहीं किया है - सब कुछ बहुत परिष्कृत है, जैसा कि स्काला भाषा में है। मुझे कुछ सरल लगता है ... यह आंशिक रूप से इसलिए हो सकता है कि बहुत से लोग यह संकेत दे सकते हैं कि यहाँ मैं स्काला में नहीं, बल्कि जावा में स्काला वाक्य रचना में लिख रहा हूँ। मैं तर्क नहीं देता, मैं जावास्क्रिप्ट पसंद करता हूं, और स्काला मुझे सिर्फ यह बताता है कि "फ़ंक्शन एक ऑब्जेक्ट है", जो जावा में जावास्क्रिप्ट की तुलना में कमी थी।

इस पूरी चीज को कैसे लॉन्च किया जाए


यदि ज़ेन बौद्ध में, तो दो फाइलें पर्याप्त हैं: build.sh of “javac -d classes *.java; scalac -classpath […] -d classes *.scala” “javac -d classes *.java; scalac -classpath […] -d classes *.scala” और run.sh of the फॉर्म “scala -classpath […] -D=8090 Main”

हालांकि, "कलेक्टर" का उपयोग करना बेहतर है, इसलिए फ़ाइल नाम मास्क के साथ गड़बड़ न करें, और एक पंक्ति में एक लंबी कक्षा के साथ: एक सही कलेक्टर (मावेन नहीं) आपको एक शेल की तुलना में बहुत अधिक स्वतंत्रता (और पठनीयता) देगा। वह आपके लिए उपयोग किए जाने वाले सभी पुस्तकालयों को डाउनलोड करेगा, और वह प्रत्येक जार'निक को नाम के साथ वर्गपथ में जोड़ देगा (और आपको इसे मैन्युअल रूप से नहीं करना होगा)।

हम युवा (अब संस्करण 1.0 के बारे में) और ग्रैडल प्रोजेक्ट को विकसित करेंगे, जो मुझे मावेन की तुलना में अच्छे पुराने चींटी की अधिक याद दिलाता है, जिसमें यह डेवलपर को तंग फ्रेम में लॉक नहीं करता है, लेकिन, इसके विपरीत, देता है रचनात्मकता की पूर्ण स्वतंत्रता, और यहां तक ​​कि एक पर्याप्त ग्रूवी भाषा (जावा दुनिया में रूबी क्लोन) में भी।

स्थापना


हमने जेडीके लगा दिया। जाँच करें: java -version

* आपको JDK फ़ोल्डर पर JAVA_HOME सिस्टम वैरिएबल सेट करने और PATH में bin रजिस्टर करने की आवश्यकता हो सकती है।

स्काला डाउनलोड करें, और PATH को bin लिखें। जाँच करें: scala –version

ग्रेडेल को डाउनलोड करें, और PATH को bin लिखें। जाँच करें: gradle –v

परियोजना



परियोजना स्वयं गितुब पर स्थित है । यहां मैं तीन मुख्य फाइलों का कोड दूंगा।

ग्रैडल के लिए विधानसभा निर्देश - build.gradle

 //   Scala apply plugin: 'scala' ext.scala_version = '2.9.1' ext.jersey_version = '1.12' ext.description = 'Accessing various calculation tasks' //   —   - //   «compileJava»  «compileScala»,      task go(dependsOn: ['compileJava', 'compileScala'], type: JavaExec) { main = 'Main' classpath = sourceSets.main.runtimeClasspath standardInput = System.in systemProperty 'package', 'web' systemProperty 'port', '8090' } //    sourceSets { //  main { java { //      «sources» srcDir 'sources' } scala { //  Scala    «sources» srcDir 'sources' } } } //      «classes» sourceSets.main.output.classesDir = 'classes' //   dependencies { //     Scala  Gradle scalaTools group: 'org.scala-lang', name: 'scala-compiler', version: scala_version scalaTools group: 'org.scala-lang', name: 'scala-library', version: scala_version //  ,    compile group: 'org.scalatra', name: 'scalatra_2.9.1', version: '2.1.0.M1' runtime group: 'org.scalatra', name: 'scalatra_2.9.1', version: '2.1.0.M1' compile group: 'org.mortbay.jetty', name: 'jetty', version: '7.0.0.pre5' runtime group: 'org.mortbay.jetty', name: 'jetty', version: '7.0.0.pre5' compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' //      jar-   «libraries», //        compile fileTree(dir: 'libraries', include: '*.jar') runtime fileTree(dir: 'libraries', include: '*.jar') } //     repositories { mavenCentral() } 


अब, वास्तव में, हमारी REST वेब सेवा, जो व्हर्लपूल या SHA-512 पर एक पासवर्ड हैश करना संभव बनाती है - Hasher.scala

 package web import hash.Whirlpool import hash.SHA class Hasher extends tools.WebService { def path = "/ѣ" get("/") { " : Whirlpool, SHA" } get("/Whirlpool/:what") { val  = params("what") json("" -> , "ѣ" -> Whirlpool.hash()) } get("/SHA/:what") { val  = params("what") json("" -> , "ѣ" -> SHA.hash()) } } 


और वेब सर्वर लांचर जो मैंने लिखा था (बिल्ड.ग्रेडल में निर्दिष्ट "पैकेज" पैकेज से सभी वेब सेवाओं को लॉन्च करता है) - मेनकाला

 import org.mortbay.jetty.Server import org.mortbay.jetty.servlet.{Context, ServletHolder} import tools._ object Main extends App { //  Jetty val server = new Server(System.getProperty("port").toInt) val root = new Context(server, "/", Context.SESSIONS) //      Rest - val package_name : String = System.getProperty("package") //   ScalatraServlet    ( ) ""   . //    "path"  . for (handler <- PackageScanner.getClasses(package_name) if classOf[org.scalatra.ScalatraServlet].isAssignableFrom(handler)) { //      val servlet = handler.newInstance().asInstanceOf[javax.servlet.Servlet] //    ""  try { //     path() val path = handler.getMethod("path").invoke(servlet).toString // ""      Jetty root.addServlet(new ServletHolder(servlet), path + "/*") println(handler.getPackage().getName() + "." + handler.getName() + " is mapped to " + path) } catch { //    path()   case error: NoSuchMethodException => throw new RuntimeException("Method path() not found in class " + handler.getPackage().getName() + "." + handler.getName()) } } //  Jetty server.start() server.join() } 


हम लॉन्च करते हैं


संग्रह डाउनलोड करें , इसे अनपैक करें, फ़ोल्डर में जाएं और gradle go कमांड को निष्पादित करें। सफल होने पर, आप कंसोल में वेब सर्वर का शुभारंभ देखेंगे:

 धीरे-धीरे जाना
 : संकलनजवा
 : संकलनशील
 : processResources यूपी-टू-डेट
 : कक्षाएं
 : जाओ
 SLF4J: "org.slf4j.impl.StaticLoggerBinder" श्रेणी को लोड करने में विफल।
 SLF4J: नो-ऑपरेशन (एनओपी) लकड़हारा कार्यान्वयन के लिए डिफ़ॉल्ट
 SLF4J: अधिक विवरण के लिए http://www.slf4j.org/codes.html#StaticLoggerBinder देखें
 > बिल्डिंग>: जाओ


चेक


ग्रीटिंग
SHA-512 एल्गोरिथ्म का उपयोग करके हमारे पासवर्ड को हैश करें
व्हर्लपूल एल्गोरिथ्म का उपयोग करके हमारे पासवर्ड को हैश करें

यदि आपके पास करने के लिए (या दिलचस्प) कुछ भी नहीं है, तो आप और अधिक पढ़ सकते हैं


Scalatra
ग्रैडल पर असेंबली कैसे लिखें
सरल जर्सी आराम सेवा
रूसी में ग्रैडल के बारे में
स्काला क्या है और यह क्या सुविधाजनक है
अनफ़िल्टर्ड - स्काला के लिए हल्के आरईएस फ्रेमवर्क
स्प्रे स्काला के लिए एक उन्नत REST फ्रेमवर्क है
ब्लू आइज़ भी स्काला के लिए एक उन्नत REST फ्रेमवर्क है।

Source: https://habr.com/ru/post/In143603/


All Articles