#Region "Microsoft.VisualBasic::e007d8676498801a770335eff8178619, RQL\RESTProvider.vb" ' Author: ' ' asuka (amethyst.asuka@gcmodeller.org) ' xie (genetics@smrucc.org) ' xieguigang (xie.guigang@live.com) ' ' Copyright (c) 2018 GPL3 Licensed ' ' ' GNU GENERAL PUBLIC LICENSE (GPL3) ' ' ' This program is free software: you can redistribute it and/or modify ' it under the terms of the GNU General Public License as published by ' the Free Software Foundation, either version 3 of the License, or ' (at your option) any later version. ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY; without even the implied warranty of ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' ' You should have received a copy of the GNU General Public License ' along with this program. If not, see . ' /********************************************************************************/ ' Summaries: ' Class RESTProvider ' ' Properties: LinqProvider ' ' Constructor: (+2 Overloads) Sub New ' ' Function: __helps, __httpProcessor, AddLinq ' ' Sub: __apiInvoke, handleGETRequest, handleOtherMethod, handlePOSTRequest ' ' /********************************************************************************/ #End Region Imports System.IO Imports System.Net.Sockets Imports Microsoft.VisualBasic.Serialization.JSON Imports sciBASIC.ComputingServices.Linq.Framework.Provider Imports sciBASIC.ComputingServices.RQL.Linq Imports SMRUCC.WebCloud.HTTPInternal.Core ''' ''' 在线查询服务提供模块,在这个模块之中只负责进行url参数的解析工作 ''' Public Class RESTProvider : Inherits HttpServer Public ReadOnly Property LinqProvider As LinqAPI ''' ''' ''' ''' ''' 需要在这里将url转换为Long以进行protocol的绑定操作 Sub New(portal As Integer, repo As Linq.Repository) Call MyBase.New(portal) Me.LinqProvider = New LinqAPI(repo) End Sub Sub New() Call Me.New(80, Repository.LoadDefault) End Sub Public Function AddLinq(url As String, resource As String, handle As GetLinqResource) As Boolean Try Call LinqProvider.Repository.AddLinq(url, resource, handle) Catch ex As Exception ex = New Exception(url, ex) ex = New Exception(resource, ex) Call App.LogException(ex) Return False End Try Return True End Function ''' ''' http://linq.gcmodeller.org/kegg/pathways?where=test_expr(pathway) ''' 测试条件里面的对象实例的标识符使用资源url里面的最后一个标识符为变量名 ''' 测试条件表达式使用VisualBasic的语法 ''' 测试条件必须以where起头开始 ''' ''' ''' 返回一个网络终点IpEndPoint Public Overrides Sub handleGETRequest(p As HttpProcessor) If p.IsWWWRoot Then Call p.WriteLine(__helps) ' 返回帮助信息 Else Call __apiInvoke(p) End If End Sub Private Function __helps() As String End Function Private Sub __apiInvoke(p As HttpProcessor) Dim url As String = p.http_url Dim pos As Integer = InStr(url, "?") Dim args As String = "" If pos = 0 Then ' expr为空 Else args = Mid(url, pos + 1).Trim ' 参数里面可能含有转意字符,还需要进行转意 args = args.UrlDecode url = Mid(url, 1, pos - 1).ToLower End If Call p.writeSuccess(1024) Select Case url Case "/move_next.vb" Call p.WriteLine(LinqProvider.MoveNext(args.QueryStringParameters)) Case "/helps" Call p.WriteLine(__helps) Case "/close.vb" Call p.WriteLine(LinqProvider.Free(args.QueryStringParameters)) Case Else ' 打开linq查询 Dim Linq As LinqEntry = LinqProvider.OpenQuery(url, args) Call p.outputStream.WriteLine(Linq.GetJson) End Select End Sub Public Overrides Sub handlePOSTRequest(p As HttpProcessor, inputData As MemoryStream) Call p.writeFailure("Method not allowed!") End Sub Protected Overrides Function __httpProcessor(client As TcpClient) As HttpProcessor Return New HttpProcessor(client, Me) End Function Public Overrides Sub handleOtherMethod(p As HttpProcessor) End Sub Public Overrides Sub handlePUTMethod(p As HttpProcessor, inputData As MemoryStream) Throw New NotImplementedException() End Sub End Class