我使用 mvc4 asp.net web api 创建了一个 RestFUL api,我的一个客户需要从他的 visual fox pro 系统中使用一些服务。
他告诉我不能使用我的 RestFUL 服务,因为没有办法。我对 Visual FoxPro 一无所知。
有什么方法可以使用 Visual Fox Pro 的 RestFUL 服务?
我使用 mvc4 asp.net web api 创建了一个 RestFUL api,我的一个客户需要从他的 visual fox pro 系统中使用一些服务。
他告诉我不能使用我的 RestFUL 服务,因为没有办法。我对 Visual FoxPro 一无所知。
有什么方法可以使用 Visual Fox Pro 的 RestFUL 服务?
你真的在这里问了两个问题。
没有。在 Web 服务从古怪的浏览器转向中心技术之前,Visual FoxPro 的有意义的开发就停止了,因此这个遗留的 xBase 系统从未调整为能够与它们通信。
是的。VFP 可以充当 COM 或 ODBC 客户端,并且可以利用从这些方法中的任何一种中继的数据。如果您没有遇到安全墙并且有足够的技能手动指定 HTTP 标头,那么标准 (1) MSXML.XMLhttpRequest 对象是您的最佳选择。
请注意,尽管至少有一个库可以将 JSON 转换为 VFP 可用的对象,但您将无法在 FoxPro 中本地使用 JSON。如果您有选择,XML 是更可取的,因为您可以利用在 Visual FoxPro 的最后一个版本中引入的 XMLAdapter 类。
(1:“标准”在这里的意思是“Windows 平台上的标准。”任何允许运行 Visual FoxPro 并且应该允许在 Internet 附近的任何地方都已经安装了 MSXML。)
虽然没有从 VFP 调用 REST 服务的“本机”方式,但是您可以轻松地创建一个 MSXML2.ServerXMLHTTP 对象,它是 Windows 自带的。我只使用 MSSoap.SoapClient30 进行 SOAP 调用(您必须安装它),但我更喜欢 MSXML2.ServerXMLHTTP 对象进行 REST 调用。
下面是一个如何通过 VFP 调用 REST 服务的示例。
调用 REST GET 方法的示例
xmlHttp = CREATEOBJECT("MSXML2.ServerXMLHTTP")
xmlHttp.open("GET", "put url with parameters here", null)
xmlHttp.setRequestHeader("Content-Type", "text/xml")
xmlHttp.send("")
result = xmlHttp.responseText
? result
调用 REST POST 方法的示例
xmlHttp = CREATEOBJECT("MSXML2.ServerXMLHTTP")
xmlHttp.open("POST", "put URL here", null)
xmlHttp.setRequestHeader("Content-Type", "text/xml")
xmlHttp.send("put string to send in body")
result = xmlHttp.responseText
? result
是的,
FoxPro 可以使用 Mircrsoft Soap SDK 软件连接到任何 WebServervice,这个最好是返回一个 XML。
这是我在安装免费软件“soapsdk.exe”后使用的
local loWS, loP
loWS=createobject("mssoap.soapclient30")
loWS.mssoapinit("http://nn.nn.nnn.nn:80/Default.asmx?WSDL")
loP=loWS.name_public_method(html_param_1,html_param_2...)
loP 包含可以包含 XML 格式的结果
现在是 2021 年,没有本地方法可以做到这一点。但是,调用 REST 服务所需的只是:
您可以使用 FoxPro 代码(或此线程中其他答案中显示的一些 XmlHttp 代码)创建一个非常简单的 WinHttp HTTP 客户端:
FUNCTION WinHttp(lcUrl, lcVerb, lcPostData, lcContentType)
LOCAL lcResult
*** FOR DEMOS ONLY!
IF EMPTY(lcUrl)
RETURN null
ENDIF
IF EMPTY(lcVerb)
lcVerb = "GET"
IF !EMPTY(lcPostData)
lcVerb = "POST"
ENDIF
ENDIF
*** Example of using simplistic WinHttp client to retreive HTTP content
LOCAL loHttp as WinHttp.WinHttpRequest.5.1, lcResult
loHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
loHTTP.Open(lcVerb, lcUrl,.F.)
IF !EMPTY(lcContentType) AND lcVerb = "POST" OR lcVerb = "PUT"
loHttp.SetRequestHeader("Content-Type",lcContentType)
ENDIF
*** If using POST you can post content as a parameter
IF !EMPTY(lcPostData)
loHTTP.Send(lcPostData)
ELSE
loHttp.Send()
ENDIF
lcResult = loHttp.ResponseText
loHttp = NULL
RETURN lcResult
这是没有纠错的非常基本的代码,但你可以从那里开始。
lcResult = WinHttp("https://albumviewer.west-wind.com/api/artist/1")
? lcResult && JSON response
*** Create some JSON to post manually
TEXT TO lcJson NOSHOW
{
"username": "test",
"password": "test"
}
ENDTEXT
lcResult = WinHttp("https://albumviewer.west-wind.com/api/authenticate","POST",lcJson,"application/json")
? lcResult && JSON
对于 JSON 序列化和解析,您需要使用某种库。下面是几个仍在维护的 FoxPro JSON 库:
组装wwHttp
并wwJsonSerializer
手动看起来像这样以发出POST
请求并接收 JSON 结果作为对象:
LOCAL loHttp as wwHttp, loSer as wwJsonSerializer
loHttp = CREATEOBJECT("wwHttp")
loSer = CREATEOBJECT("wwJsonSerializer")
loUser = CREATEOBJECT("EMPTY")
ADDPROPERTY(loUser,"Username", "test")
ADDPROPERTY(loUser, "Password", "test")
lcJson = loSer.Serialize(loUser)
loHttp.cContentType = "application/json"
lcJson = loHttp.Post("https://albumviewer.west-wind.com/api/authenticate", lcJson)
IF loHttp.nError # 0
? "Failed: " + loHttp.cErrorMsg
ENDIF
IF loHttp.cResultCode = "401"
? "Login failed. Invalid credentials"
RETURN
ENDIF
IF loHttp.cResultCode # "200"
? "Failed: " + loHttp.cResultCode + " " + loHttp.cResultCodeMessage
RETURN
ENDIF
loAuth = loSer.Deserialize(lcJson)
lcToken = loAuth.Token && JSON Object contains token
IF EMPTY(lcToken)
? "Authentication failed. Invalid token."
RETURN
ENDIF
如果您需要更多详细信息和背景信息,您可以在此处查看详细的白皮书,其中讨论了 FoxPro 特定场景的客户端和服务器端: