主要内容:
1. 问题说明
2. WSDL
3. Python测试脚本
4. 测试结果
5. 总结
1. 问题说明
soap请求方法getPosterityNodes时出现504错误。
504错误是什么
- 使用soap协议进行ws请求时,服务端超时返回,无响应
2. WSDL
生成的wsdl如下
Service ( TreeNodeInfoProviderService ) tns="urn:TreeNodeInfoProviderwsdl"
Prefixes (1)
ns0 = "http://schemas.xmlsoap.org/soap/encoding/"
Ports (1):
(TreeNodeInfoProviderPort)
Methods (55):
getAncestorNodeIds(xs:int nodeId, xs:int withZero, xs:int withSelf)
getAncestorNodes(xs:int nodeId, xs:int withZero, xs:int withSelf)
getBudgetRelatedNodeIdsById(xs:int nodeId)
getBudgetRelatedNodeIdsByPath(xs:string path)
getBudgetRelatedNodesById(xs:int nodeId)
getBudgetRelatedNodesByPath(xs:string path)
getChildrenNodeIds(xs:int nodeId)
getChildrenNodeIdsByUserId(xs:int nodeId, xs:int userId, xs:string funcName)
getChildrenNodes(xs:int nodeId)
getChildrenNodesByUserId(xs:int nodeId, xs:int userId, xs:string funcName)
getDepartmentNodeByNodeId(xs:int nodeId)
getDepartments()
getNodeById(xs:int nodeId)
getNodeByPath(xs:int treeId, xs:string path)
getNodeIdByPath(xs:int treeId, xs:string path)
getNodeIdsByName(xs:string name)
getNodeIdsByPartName(xs:string name)
getNodeIdsByPartPath(xs:string name)
getNodeIdsByProductLineId(xs:int productLineId)
getNodeIdsByTagType(xs:string tagType)
getNodeIdsByTagTypeName(xs:string tagType, xs:string tagName)
getNodeIdsByTreeIdPartPath(xs:int treeId, xs:string name)
getNodeIdsByTreeIdProductLineName(xs:int treeId, xs:string productLineName)
getNodePathById(xs:int nodeId)
getNodePathsByIds(ns0:Array nodeIds)
getNodesByName(xs:string name)
getNodesByPartName(xs:string name)
getNodesByPartPath(xs:string name)
getNodesByProductLineId(xs:int productLineId)
getNodesByProductLineName(xs:string productLineName)
getNodesByTagTypeName(xs:string tagType, xs:string tagName)
getNodesByTreeIdPartPath(xs:int treeId, xs:string name)
getNumPathByNodeId(xs:int nodeId)
getPosterityNodeIds(xs:int nodeId, xs:int withSelf)
getPosterityNodeIdsByProductLineId(xs:int productLineId)
getPosterityNodeIdsByProductLineName(xs:string name)
getPosterityNodeIdsByUserId(xs:int nodeId, xs:int userId, xs:int withSelf, xs:string funcName)
getPosterityNodes(xs:int nodeId, xs:int withSelf)
getPosterityNodesByProductLineId(xs:int productLineId)
getPosterityNodesByProductLineName(xs:string name)
getPosterityNodesByUserId(xs:int nodeId, xs:int userId, xs:int withSelf, xs:string funcName)
getProductLineById(xs:int productLineId)
getProductLineByName(xs:string name)
getProductLineNodeByNodeId(xs:int nodeId)
getProductLineNodes()
getProductLines()
getSpecialTreeNodeFullInfoByNodeid(xs:int nodeId, xs:int userId)
getSpecialTreeNodeInfo(xs:int nodeId)
getSpecialTreeNodeInfoByNodeid(xs:int nodeId, xs:int userId)
getTagNamesByTagType(xs:string tagType)
getTagTypeNameHash()
getTagTypes()
proxyCall(xs:string rMethod, xs:string rParamList)
suggestNodePaths(xs:int treeId, xs:string token, xs:int limit)
suggestNodePathsByUserId(xs:int treeId, xs:string token, xs:int limit, xs:int userId)
Types (48):
ns0:Array
ns0:ENTITIES
ns0:ENTITY
ns0:ID
ns0:IDREF
ns0:IDREFS
ns0:NCName
ns0:NMTOKEN
ns0:NMTOKENS
ns0:NOTATION
ns0:Name
ns0:QName
ns0:Struct
ns0:anyURI
ns0:arrayCoordinate
ns0:base64
ns0:base64Binary
ns0:boolean
ns0:byte
ns0:date
ns0:dateTime
ns0:decimal
ns0:double
ns0:duration
ns0:float
ns0:gDay
ns0:gMonth
ns0:gMonthDay
ns0:gYear
ns0:gYearMonth
ns0:hexBinary
ns0:int
ns0:integer
ns0:language
ns0:long
ns0:negativeInteger
ns0:nonNegativeInteger
ns0:nonPositiveInteger
ns0:normalizedString
ns0:positiveInteger
ns0:short
ns0:string
ns0:time
ns0:token
ns0:unsignedByte
ns0:unsignedInt
ns0:unsignedLong
ns0:unsignedShort
3. Python测试脚本
使用Python进行soap请求,观察结果,测试脚本如下
from suds.client import Client
from suds.xsd.doctor import ImportDoctor, Import
from suds.wsse import *
import datetime
url = 'http://st01-noah-matrix86.st01:8810/olive/index.php?r=Tree/infoWS/ws'
doctor = ImportDoctor(imp)
client = Client(url, doctor = doctor)
security = Security()
token = UsernameToken('admin', 'admin')
security.tokens.append(token)
client.set_options(wsse=security)
print(client) #打印输出ws提供的接口描述信息(wsdl)
starttime = datetime.datetime.now()
re = client.service.getNodeById(18) #调用ws方法getNodeById(int)
re = client.service.getNodePathById() #调用ws方法getNodePathById(int)
re = client.service.getPosterityNodeIds(18,1) #调用ws方法getPosterityNodeIds(int,int),获取指定节点的所有孩子节点的id
re = client.service.getPosterityNodes(22,1) #调用ws方法getPosterityNodes(int,int),获取指定节点的所有孩子节点详细信息
print("获取的节点内容:",re)
endtime = datetime.datetime.now()
print ("运行时间:",(endtime - starttime).seconds) #输出调用方法运行时间
4. 测试结果
参数:nodeId=0时,可以正常返回。
调用方法返回结果运行时间getNodeByIdroot节点0getPosterityNodeIds480759个孩子节点119getPosterityNodesNone7
参数:nodeId=1时,可以正常返回。
调用方法返回结果运行时间getNodeByIdBAIDU节点0getPosterityNodeIds476727个孩子节点131getPosterityNodesNone7
参数:nodeId=3时,504错误出现。
调用方法返回结果运行时间getNodeByIdBAIDU_PS_www(产品线节点)0getPosterityNodeIds61720个孩子节点18getPosterityNodes无返回504错误
参数:nodeId=22时,可以正常返回。
调用方法返回结果运行时间getNodeByIdBAIDU_PS_www_online_rs_build_rs-build-rscompact.www.all(叶子节点)0getPosterityNodeIds1个孩子节点(包括自己)0getPosterityNodes可以正常返回自身的详细信息0
参数:nodeId=18时,可以正常返回。
调用方法返回结果运行时间getNodeByIdBAIDU_PS_www_online_rs_build(服务节点)0getPosterityNodeIds[18, 12055, 22, 23, 24, 200118829]共6个节点0getPosterityNodes可以正常返回6个节点的详细信息0
5. 总结
- root节点和BAIDU公司节点在获取孩子节点的详细信息时可以正常返回,但是返回为None
- 测试节点id = 3,该节点是一产品线节点,下面有60000多孩子节点,获取所有孩子节点id耗时18s,获取所有孩子节点详细信息时,出现504错误
- 其余测试节点,18和22,下面的孩子节点个数比较少,都可以按时正常返回结果,并且结果符合预期
故:产生504错误的原因可能是大量查询操作耗时太久导致ws服务端未能按时返回结果导致504错误。