เว็บเซอร์วิส (Webservice) (เอกสาร Microsoft Word)
เว็บเซอร์วิส คือ แอพพลิเคชั่น (Application) หรือฟังก์ชัน (Function) หรือ ซอฟต์แวร์คอมโพเนนต์ (Software Component)
ที่ถูกสร้างขึ้น เพื่อรอรับการเรียกใช้งานจากแอพพลิเคชั่นในอินเทอร์เน็ต
หรือการให้บริการระหว่างเครื่องบริการในอินเทอร์เน็ต
มีการสื่อสารด้วยข้อมูลที่อยู่ในรูปแบบเอ็กเอ็มแอล (XML = eXtensible Markup Language) ตามมาตรฐานโซป (SOAP = Simple Object Access Protocol คือ ระเบียบวิธีการสำหรับแลกเปลี่ยนข้อมูล XML ระหว่างเครื่องคอมพิวเตอร์ในอินเทอร์เน็ต)
ความหมายของ Webservices ( petefreitag.com | narisa.com/blog/patrickz/ )
We will compare and contrast three methods of consuming and producing web services: XML-RPC, SOAP and REST
1. XML-RPC __ Remote Procedure Calls are used to establish and facilitate transactions between two remote systems. Example of popular RPC implementations include DCOM and CORBA. XML-RPC is an established implementation of RPC that allows you to transport XML encoded data between two servers using HTTP.
2. SOAP __ SOAP is designed as an XML wrapper for web services requests and responses. SOAP's strength lies in its use of namespaces, XML Schema datatypes, and its flexibility with regard to transports. The disadvantage of SOAP is the fact that the specs and implementation is more complex, especially when you compare it to the simple XML-RPC approach. SOAP is the bread and butter of corporate web service developers. It has been deeply integrated into Microsoft .NET and IBM WebSphere. Based on its popularity, Google and Amazon.com have both created SOAP-based Web services.
3. REST __ REST differs a great deal from SOAP and XML-RPC. First, it's not a standard, whether formal or informal. Second, there is no standardized toolkit or pre-built client and server classes in PHP. The strength of REST is that you won't need special extensions or tools to develop web services. The HTTP protocol specifications contains everything you would need to transmit and receive XML messages.
REST, which stands for "Representational State Transfer", is a simpler approach than XML-RPC or SOAP, using standard HTTP methods such as GET, POST and PUT to send and retrieve XML data. You can then use tools like PHP DOM, SAX, or even XSL to do the parsing. The downside is that everything has to be built by hand (though REST toolkits and frameworks are starting to appear in some languages). If you want to develop REST web services, you must thoroughly understand XML and HTTP. Expect to have to write a little more code yourself.
|
WSDL ที่บริการในอินเทอร์เน็ต
+ CurrencyConvertor.asmx
+ BibleWebservice.asmx
? https://rdws.rd.go.th
|
|
1. การสร้างบริการเว็บเซอร์วิสแบบออนไลน์ ด้วย Visual Studio .NET (อ้างอิงจาก aspnetthai.com)
1. เข้า Visual Studio .net และเลือก Create Web Site..
2. เลือก ASP.NET Web Service จะได้ Source code ดังนี้
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
Inherits System.Web.Services.WebService
<WebMethod()> Public Function HelloWorld(ByVal a As Integer) As String
Return "Hello World"
End Function
End Class
3. เมื่อทดสอบประมวลผลจะขึ้น open IE : http://localhost:2273/WebSite1/Service.asmx อัตโนมัติ
4. แสดงว่าเปิดบริการ เว็บเซอร์วิส มีฟังก์ชันชื่อ HelloWorld() ได้แล้ว ตัวอย่างนี้มี Random Port ที่ได้คือ 2273
5. เข้าห้อง "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe"
6. DOS>wsdl http://localhost:2273/WebSite1/Service.asmx?WSDL จะได้แฟ้ม service.cs ขนาด 4,280 Bytes
7. copy service.cs ไปไว้ในห้อง C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ และให้ cd เข้าห้องดังกล่าว
8. สั่งแปลซีชาร์ปด้วย DOS>csc /out:Service.dll /t:library /r:System.dll /r:System.Web.Services.dll Service.cs
9. ได้แฟ้ม service.dll ขนาด 6144 Bytes ให้ copy service.dll ไปไว้ที่ C:\website1\bin
10. เขียนโปรแกรมชื่อ x.aspx ไว้ในห้อง C:\website1
<%@ Import Namespace="service" %>
<%
Dim a As New service
Response.Write(a.HelloWorld() & ".")
%>
11. เปิด http://localhost:2273/WebSite1/x.aspx จะพบคำว่า Hello World.
2. การนำ Webservice ที่สร้างขึ้น ไปใช้ใน Windows Application
1. ถ้าเปิด Web service แบบชั่วคราว ก็ให้เปิด Visual Studio ใหม่เพื่อสร้าง Application ใหม่
1. Create WindowsApplication1 ใน Menu Bar, Project, Add Web Reference..
2. สามารถเลือก Web services ที่บริการอยู่ได้ 1 ใน 3 วิธี
2.1 Web services in this solution
2.2 Web services on the local machine
- กรอก URL: http://localhost:1030/WebSite1/Service.asmx
- จะได้คำว่า localhost ในช่อง Web reference name แล้วกด Add reference
- ผลการ Add จะได้ Web reference เพิ่มเข้ามาใน Solution Explorer
2.3 Browse UDDI (Universal Description, Discovery and Integration) Servers on the local network.
3. สร้าง textbox1 ในฟอร์ม และเรียกใช้ web service ใน form1_load
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim a As New localhost.Service
TextBox1.Text = a.HelloWorld()
End Sub
3. ตัวอย่าง การสร้าง web service และใช้งานใน Website อย่างง่าย
1 DOS>copy "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe" C:\website1
2 DOS>cd C:\website1
3 DOS>wsdl http://localhost:1047/WebSite1/Service.asmx?WSDL
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\WebSite1\Service.cs'.
4 DOS>copy Service.cs C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
5 DOS>cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
6 DOS>csc /out:Service.dll /t:library /r:System.dll /r:System.Web.Services.dll Service.cs
7 DOS>mkdir C:\website1\bin
8 DOS>copy Service.dll C:\website1\bin
<%@ Import Namespace="service" %>
<%
Try
Dim a As New Service
Response.Write(a.HelloWorld())
Catch ex As Exception
End Try
%>
โปรแกรมนี้อาจ error เพราะสร้าง wsdl ผ่าน http://localhost:1047 จึงใช้ไม่ได้
4. ตัวอย่าง การสร้าง web service เชื่อมต่อข้อมูลกับ MYSQL ODBC
|
x.asmx คือ แฟ้มที่บริการ web service
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Data.Odbc
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function listuserpassword(ByVal u As String) As String
Dim connstr As String = "DRIVER={MySQL ODBC 3.51 Driver};" & _
"SERVER=127.0.0.1;DATABASE=mysql;UID=admin;PASSWORD=p;OPTION=3"
Dim conn As New OdbcConnection(connstr)
conn.Open()
Dim cmd As New OdbcCommand
cmd.Connection = conn
cmd.CommandText = "select user,password from user where user='" & u & "'"
Dim s As String = ""
Dim r As OdbcDataReader = cmd.ExecuteReader()
While r.Read()
s &= r(1) & Chr(10)
End While
conn.Close()
Return s
End Function
End Class
x.aspx คือ แฟ้มที่เรียกใช้ web service
<%@ Import Namespace="service" %>
<%
Try
Dim a As New Service
Response.Write(a.listuserpassword("101"))
Catch ex As Exception
End Try
%>
|
5. ทดสอบ webservices ในอินเทอร์เน็ต (webservicex.net)
- ทดสอบกับ webservices.net ได้แฟ้ม CurrencyConvertor.cs ขนาด 10,528 Bytes
- ตัวอย่าง currencyconvertor.aspx และ biblewebservice.aspx
5.1 การแปลงหน่วยแลกเปลี่ยนเงิน (สั่ง wsdl หลายครั้ง กว่าจะเชื่อมต่อสำเร็จ ก็ได้ในครั้งสุดท้าย)
cd C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
wsdl http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
dir CurrencyConvertor.cs
copy CurrencyConvertor.cs %windir%\Microsoft.NET\Framework\v2.0.50727\
cd %windir%\Microsoft.NET\Framework\v2.0.50727\
csc /out:CurrencyConvertor.dll /t:library /r:System.dll /r:System.Web.Services.dll CurrencyConvertor.cs
แล้วคัดลอกแฟ้ม CurrencyConvertor.dll ไปไว้ในห้อง Bin
5.2 ข้อมูลใน bible GetBibleWordsByChapterAndVerse
cd C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
wsdl http://www.webservicex.com/BibleWebservice.asmx?WSDL
dir BibleWebservice.cs
copy BibleWebservice.cs %windir%\Microsoft.NET\Framework\v2.0.50727\
cd %windir%\Microsoft.NET\Framework\v2.0.50727\
csc /out:BibleWebservice.dll /t:library /r:System.dll /r:System.Web.Services.dll BibleWebservice.cs
แล้วคัดลอกแฟ้ม BibleWebservice.dll ไปไว้ในห้อง Bin
Classic ASP มีตัวอย่างที่ http://www.thaiabc.com/aspnet/biblewebservice.aspx
<%@ Import Namespace="BibleWebservice" %>
<%
Dim c As New BibleWebservice
dim txt as String
txt = c.GetBibleWordsByChapterAndVerse("Exodus",1,1)
response.write(txt)
txt = c.GetBibleWordsByChapterAndVerse("Exodus",1,2)
response.write(txt)
response.write(c.GetBibleWordsByChapterAndVerse("Exodus",1,3))
response.write(c.GetBibleWordsByChapterAndVerse("Exodus",1,4))
%>
|
|
99. ตัวอย่างที่ทดสอบแล้ว พบภายหลังว่าบริการที่เคยทดสอบ ถูกปิดไปแล้ว
|
99.1. ตัวอย่าง จาก http://samples.gotdotnet.com (เว็บไซต์ shutdown ไปแล้ว)
1 DOS>cd "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\"
2 DOS>wsdl http://samples.gotdotnet.com/.../MathService.asmx?WSDL
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\MathService.cs'.
3 DOS>copy MathService.cs C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
4 DOS>cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
5 DOS>csc /out:MathService.dll /t:library /r:System.dll /r:System.Web.Services.dll MathService.cs
6 DOS>mkdir C:\website7\bin
7 DOS>copy mathservice.dll C:\website7\bin
Imports System
Imports System.Web.Services
Public Class MathService : Inherits WebService
<WebMethod()> Public Function Add(a As Integer, b As Integer) As Integer
Return(a + b)
End Function
End Class
<%@ Import Namespace="mathservice" %>
<%
Dim a As New MathService
Response.Write(a.Add(1, 2))
%>
|
99.2. ตัวอย่าง การเรียกใช้ webservice ของกรมสรรพากร
+ Client Certificate http://www.rd.go.th/webservice/new/certificate_291150.cer
+ Information http://www.rd.go.th/webservice/new/tin.html
+ URL OF WSDL https://rdws.rd.go.th/ServiceRD/CheckTINPINService.asmx?WSDL
+ to setup Certificate http://support.microsoft.com/kb/307267
1. Repeat the preceding first 2 steps, click Download CA certificate, and then save it to a file on your local computer.
2. Start mmc.exe.
3. Click Console, and then click Add/Remove Snap-in.
4. In the Add/Remove Snap-in dialog box, click Add.
5. In the Add Standalone Snap-in dialog box, click Certificates, and then click Add.
6. Click Computer Account, and then click Next.
7. Click Local Computer, and then click Finish.
8. The list of certificate categories for the local computer should appear in the snap-in window.
9. Click OK to return to the Console Root window.
10. In the tree view, open the list of trusted root certificate authorities.
11. To add the certificate authority certificate that issued your server certificate
to the list, click Action, click All Tasks, and then click Import, or drag the certificate on to the list.
99.3 สร้าง proxy.bat จะได้สร้าง CheckTINPINService.dll ได้ง่าย
+ ถ้าแฟ้ม .aspx เป็นห้องใด ก็ให้เปลี่ยน C:\website9 เป็นห้องนั้น
+ 530117 : พบปัญหาตอนใช้ wsdl ว่า The remote certificate is invalid according จึงไม่ได้แฟ้ม .cs ครับ
rem proxy.bat
set curdir=C:\website9
cd "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\"
wsdl https://rdws.rd.go.th/ServiceRD/CheckTINPINService.asmx?WSDL
copy CheckTINPINService.cs %windir%\Microsoft.NET\Framework\v2.0.50727\
cd %windir%\Microsoft.NET\Framework\v2.0.50727\
csc /out:CheckTINPINService.dll /t:library /r:System.dll /r:System.Web.Services.dll CheckTINPINService.cs
mkdir %curdir%\bin
copy CheckTINPINService.dll %curdir%bin
cd %curdir%
99.4. ตัวอย่าง Code ส่วนหนึ่งของแฟ้ม .aspx
<%@ Import Namespace="CheckTINPINService" %>
<%
Dim DS As New Data.DataSet()
Dim a As New CheckTINPINService
' ServicePIN("username", "password", "PIN")
DS = a.ServicePIN("anonymous", "anonymous", 3520300266740)
Dim I, j, k As Integer
Dim s As String = ""
For I = 0 To DS.Tables.Count - 1
For j = 0 To DS.Tables(I).Rows.Count - 1
For k = 0 To DS.Tables(I).Columns.Count - 1
s &= DS.Tables(I).Rows(j).Item(k) & " "
Next
s &= "<br>"
Next
Next
Response.Write(s)
' E00002 ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้องหรือไม่มีสิทธิในการเรียกใช้ Service Username or Password are invalid
' 3520300266740 True W00000(การทำงานเสร็จสมบูรณ์) Success
|
' Source code : services.cs
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function HelloWorld(ByVal a As Integer) As String
Return (a * 2)
End Function
End Class
Code ที่มีมาตอนสร้าง Web Service สามารถนำมาปรับปรุง หรือเพิ่ม function ได้
|
<form target="_blank"
action='http://localhost:1066/WebSite3/Service.asmx/HelloWorld'
method="POST">
<input name=a value=5 />
<input type="submit" value="Submit" class="button">
</form>
ฟอร์มส่งค่าให้กับ Web Service แสดงผลลัพธ์เป็น XML อย่างถูกต้อง
|
Web Form
Add Web Reference ...
myhello
ต้อง Add Web Reference เพื่อให้เกิด Namespace จะได้ import เข้ามาใช้ใน ASP.NET ได้
|
<%@ Import Namespace="myhello" %>
<%
Dim x As New Service
Response.Write(x.HelloWorld(5))
%>
ผลการทดสอบสั้น ๆ ที่ส่งค่า และรับคืนจาก web service
|
<%@ Import Namespace="myhello" %>
<body>
<form runat=server>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<%
Dim x As New Service
If (Len(TextBox1.Text) > 0) Then
Try
Response.Write(x.HelloWorld(TextBox1.Text))
Catch ex As Exception
Response.Write("exception")
End Try
End If
%>
</form>
</body>
ส่งค่าจาก textbox ให้กับ webservice
|
<WebMethod()> _
Public Function HelloWorld(ByVal a As Integer) As String
Dim strdb As String = "C:\dthai97.mdb"
Dim strconn As String = provider=microsoft.jet.oledb.4.0;data source=" & strdb
Dim strsql As String
Dim cn As New System.Data.OleDb.OleDbConnection(strconn)
Dim cm As New OleDbCommand(strsql, cn)
Dim dr As OleDbDataReader
Dim s As String = ""
strsql = "select fid,fname,fsalary from tbthai"
cm = New OleDbCommand(strsql, cn)
cn.Open()
dr = cm.ExecuteReader()
Dim c As Integer = 0
While dr.Read()
c = c + dr.Item(2)
End While
cn.Close()
Return (c)
End Function
code แสดงการเชื่อมต่อกับฐานข้อมูล
| | | | | | |
|