ชื่อกระทู้เป็นคำถามจริงๆ เพราะ... ฉันเองก็ไม่รู้ว่ามันคืออะไรและเป็นครั้งแรกที่ฉันจะพยายามทำงานกับมันภายใต้กรอบของบทความนี้ สิ่งเดียวที่ฉันรับประกันได้ก็คือโค้ดที่แสดงด้านล่างจะใช้งานได้ แต่วลีของฉันจะเป็นเพียงการคาดเดาและการคาดเดาว่าฉันเข้าใจทั้งหมดนี้ได้อย่างไร งั้นไปกัน...
การแนะนำ
เราต้องเริ่มต้นด้วยสาเหตุที่แนวคิดของบริการเว็บถูกสร้างขึ้น เมื่อแนวคิดนี้ปรากฏขึ้นในโลก เทคโนโลยีก็มีอยู่แล้วที่อนุญาตให้แอปพลิเคชันโต้ตอบในระยะไกล โดยที่โปรแกรมหนึ่งสามารถเรียกวิธีการบางอย่างในอีกโปรแกรมหนึ่ง ซึ่งสามารถเปิดใช้งานบนคอมพิวเตอร์ที่ตั้งอยู่ในเมืองอื่นหรือแม้แต่ประเทศอื่นได้ ทั้งหมดนี้เรียกสั้น ๆ ว่า RPC (การเรียกขั้นตอนระยะไกล) ตัวอย่าง ได้แก่ เทคโนโลยี CORBA และสำหรับ Java - RMI (Remote Method Invoking) และทุกอย่างดูเหมือนจะดีในตัวพวกเขา โดยเฉพาะใน CORBA เพราะ... คุณสามารถทำงานกับมันในภาษาการเขียนโปรแกรมใดก็ได้ แต่ยังมีบางอย่างขาดหายไป ฉันเชื่อว่าข้อเสียของ CORBA ก็คือว่ามันทำงานผ่านโปรโตคอลเครือข่ายบางตัวของตัวเอง แทนที่จะเป็น HTTP แบบธรรมดา ซึ่งจะพอดีกับไฟร์วอลล์ใดๆ แนวคิดของบริการเว็บคือการสร้าง RPC ที่จะแทรกลงในแพ็กเก็ต HTTP จึงเริ่มมีการพัฒนามาตรฐาน แนวคิดพื้นฐานของมาตรฐานนี้คืออะไร:- สบู่ . ก่อนที่จะเรียกขั้นตอนระยะไกล คุณต้องอธิบายการโทรนี้ในไฟล์ XML ในรูปแบบ SOAP SOAP เป็นเพียงหนึ่งในมาร์กอัป XML จำนวนมากที่ใช้ในบริการเว็บ ทุกอย่างที่เราต้องการส่งที่ไหนสักแห่งผ่าน HTTP จะถูกแปลงเป็นคำอธิบาย XML SOAP ก่อน จากนั้นจึงยัดลงในแพ็กเก็ต HTTP และส่งไปยังคอมพิวเตอร์เครื่องอื่นบนเครือข่ายผ่าน TCP/IP
- WSDL . มีบริการเว็บเช่น โปรแกรมที่สามารถเรียกวิธีการจากระยะไกลได้ แต่มาตรฐานกำหนดให้โปรแกรมนี้ต้องมีคำอธิบายว่า "ใช่ คุณพูดถูก นี่คือบริการทางเว็บจริงๆ และคุณสามารถเรียกใช้วิธีการดังกล่าวได้จากบริการดังกล่าว" คำอธิบายนี้แสดงด้วยไฟล์ XML อื่นซึ่งมีรูปแบบที่แตกต่างกัน คือ WSDL เหล่านั้น. WSDL เป็นเพียงไฟล์ XML ที่อธิบายบริการบนเว็บและไม่มีอะไรเพิ่มเติม
แนวทางทั่วไป
ในบริการบนเว็บจะมีไคลเอนต์และเซิร์ฟเวอร์อยู่เสมอ เซิร์ฟเวอร์คือบริการบนเว็บของเรา และบางครั้งเรียกว่าจุดสิ้นสุด (เช่นเดียวกับใน จุดสิ้นสุดที่ข้อความ SOAP จากไคลเอนต์ไปถึง) เราจำเป็นต้องทำสิ่งต่อไปนี้:- อธิบายอินเทอร์เฟซของบริการบนเว็บของเรา
- ใช้อินเทอร์เฟซนี้
- เปิดตัวบริการเว็บของเรา
- เขียนไคลเอนต์และเรียกใช้วิธีการบริการเว็บที่ต้องการจากระยะไกล
main
และเปิดบริการเว็บโดยตรงในฐานะเซิร์ฟเวอร์ หรือปรับใช้กับเซิร์ฟเวอร์เช่น Tomcat หรืออื่น ๆ ในกรณีที่สอง เราไม่ได้เปิดเซิร์ฟเวอร์ใหม่และไม่ได้เปิดพอร์ตอื่นบนคอมพิวเตอร์ แต่เพียงบอกคอนเทนเนอร์เซิร์ฟเล็ต Tomcat ว่า “เราได้เขียนคลาสบริการเว็บที่นี่ โปรดเผยแพร่เพื่อให้ทุกคนที่ติดต่อคุณสามารถ ใช้บริการเว็บของเรา" ไม่ว่าเราจะเปิดบริการเว็บด้วยวิธีใดเราก็จะมีลูกค้ารายเดียวกัน
เซิร์ฟเวอร์
มาเปิดตัว IDEA และสร้างโครงการใหม่ Create New Project ระบุชื่อHelloWebServiceและคลิก ปุ่ม ถัดไปจากนั้นคลิก ปุ่ม เสร็จสิ้น ใน โฟลเดอร์ src เราจะ สร้างแพ็คเกจru.javarush.ws ในแพ็คเกจนี้เราจะสร้างอินเทอร์เฟซHelloWebService
:
package ru.javarush.ws;
// это аннотации, т.е. способ отметить наши классы и методы,
// How связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// говорим, что наш интерфейс будет работать How веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
// говорим, что этот метод можно вызывать удаленно
@WebMethod
public String getHelloString(String name);
}
ในโค้ดนี้ คลาสต่างๆ เรียกว่าคำอธิบายประกอบ WebService
และWebMethod
ไม่ทำอะไรเลยนอกจากทำเครื่องหมายอินเทอร์เฟซของเราและวิธีการของคลาสนั้นเป็นบริการบนเว็บ เช่นเดียวกับชั้นSOAPBinding
เรียน ข้อแตกต่างเพียงอย่างเดียวคือSOAPBinding
เป็นคำอธิบายประกอบพร้อมพารามิเตอร์ ในกรณีนี้ พารามิเตอร์จะถูกใช้style
พร้อมกับค่าที่ระบุว่าบริการเว็บจะไม่ทำงานผ่านข้อความเอกสาร แต่เป็น RPC แบบคลาสสิก เช่น เพื่อเรียกวิธีการ ลองใช้ตรรกะอินเทอร์เฟซของเราและสร้างคลาสในแพ็คเกจของHelloWebServiceImpl
เรา โดยวิธีการที่ฉันทราบว่าการสิ้นสุดคลาสด้วย Impl เป็นแบบแผนใน Java ตามที่กำหนดการใช้งานอินเทอร์เฟซ (Impl - จากคำว่า การใช้งาน เช่น การใช้งาน) นี่ไม่ใช่ข้อกำหนดและคุณมีอิสระที่จะตั้งชื่อชั้นเรียนตามที่คุณต้องการ แต่มารยาทที่ดีจำเป็นต้องมี:
package ru.javarush.ws;
// таже annotation, что и при описании интерфейса,
import javax.jws.WebService;
// но здесь используется с параметром endpointInterface,
// указывающим полное Name класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String getHelloString(String name) {
// просто возвращаем приветствие
return "Hello, " + name + "!";
}
}
มาเปิดตัวบริการเว็บของเราในฐานะเซิร์ฟเวอร์อิสระเช่น โดยไม่ต้องมีส่วนร่วมของ Tomcat และเซิร์ฟเวอร์แอปพลิเคชันใด ๆ (นี่คือหัวข้อสำหรับการสนทนาแยกต่างหาก) ในการทำเช่นนี้เราจะสร้างแพ็คเกจ ในโครงสร้างโปรเจ็กต์ในโฟลเดอร์ srcru.javarush.endpoint
และในนั้นเราจะสร้างคลาสHelloWebServicePublisher
ด้วยเมธอดmain
:
package ru.javarush.endpoint;
// класс, для запуска веб-serverа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;
public class HelloWebServicePublisher {
public static void main(String... args) {
// запускаем веб-server на порту 1986
// и по addressу, указанному в первом аргументе,
// запускаем веб-сервис, передаваемый во втором аргументе
Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
}
}
ตอน นี้ เรามารันคลาสนี้โดยกดShift+F10 จะไม่ปรากฏในคอนโซล แต่เซิร์ฟเวอร์กำลังทำงานอยู่ คุณสามารถตรวจสอบได้โดยพิมพ์บรรทัดhttp://localhost:1986/wss/hello?wsdl ในเบราว์เซอร์ ของ คุณ ในทางกลับกัน หน้าที่เปิดขึ้นมาจะพิสูจน์ได้ว่าเรามีเว็บเซิร์ฟเวอร์ (http://) ที่ทำงานบนพอร์ต 1986 บนคอมพิวเตอร์ของเรา (localhost) และในทางกลับกัน แสดงคำอธิบาย WSDL ของบริการบนเว็บของเรา หากคุณหยุดแอปพลิเคชัน คำอธิบายจะไม่สามารถใช้งานได้ เช่นเดียวกับบริการบนเว็บ ดังนั้นเราจะไม่ทำเช่นนี้ แต่ดำเนินการเขียนไคลเอ็นต์ต่อไป
ลูกค้า
ในโฟลเดอร์โปรเจ็กต์srcเราจะสร้างแพ็คเกจru.javarush.client
และในนั้นจะมีคลาสHelloWebServiceClient
ที่มีเมธอดmain
:
package ru.javarush.client;
// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;
// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;
public class HelloWebServiceClient {
public static void main(String[] args) throws MalformedURLException {
// создаем ссылку на wsdl описание
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
// Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
// 1-ый аргумент смотрим в атрибуте targetNamespace
// 2-ой аргумент смотрим в атрибуте name
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
// Теперь мы можем дотянуться до тега service в wsdl описании,
Service service = Service.create(url, qname);
// а далее и до вложенного в него тега port, чтобы
// получить ссылку на удаленный от нас an object веб-сервиса
HelloWebService hello = service.getPort(HelloWebService.class);
// Ура! Теперь можно вызывать удаленный метод
System.out.println(hello.getHelloString("JavaRush"));
}
}
ฉันให้ความคิดเห็นสูงสุดเกี่ยวกับรหัสในรายการ ฉันไม่มีอะไรจะเพิ่ม ดังนั้นมาเริ่มกันเลย (Shift+F10) เราควรเห็นข้อความในคอนโซล: Hello, JavaRush!
หากคุณไม่เห็นแสดงว่าคุณอาจลืมเริ่มบริการเว็บ
GO TO FULL VERSION