I am not knowledgeable about most web stuff. but I need to get a an app done that uses a Web service ASAP (like today) and am having big issues. In my initial testing it seemed to work… but more extensive testing i showing a showstopper.
I am using the service’s search function to retrieve chemical information … I first have to search to get a record ID from teh service and can then can use that to get other info once I have that.
The search request fails on some items (compound names) with “HTTP Error 400. The request is badly formed”, but works with others, which makes it hard to figure out… And i can’t see a significant difference between the names it works for and and the ones it dos not.
The service has a web page where you can enter the search term (and your login token), submit the request and see the returned result. THAT WORKS for the compound name that is failing In my code, so it can’t be something in the name itself.
The service has 4 APIs: SOAP 1.1, SOAP 1.2, HTTP GET and HTTP POST. I don’t know which
I could not get the Xojo Soap class to work (Don’t know if it is 1.1 0r 1.2) at all so I used HTTP GET as it seemed simplest.
Any suggestion/help would be gently appreciated
This is the page:
http://www.chemspider.com/Search.asmx?op=SimpleSearch
This is my code (in a subclass of HTTPSocket) :
[code]Private Function GetChemSpiderID(CAS_No as String, Name as String, TimeOut as integer=-1, Retries as integer = -1) As String
Static Cmd As String = “www.chemspider.com/Search.asmx/SimpleSearch?query=CAS_No&token=”+CSToken
’
Dim theCmd As String = Cmd.Replace(“CAS_No”, CAS_No)
Dim XmlStr as String = DefineEncoding(GetTimed(theCmd, TimeOut, Retries), Encodings.UTF8)
Dim XDoc As New XmlDocument(XmlStr)
Dim Node as XmlNode = XDoc.DocumentElement
Dim CS_ID as String
If Node.ChildCount > 0 then CS_ID = Node.FirstChild.FirstChild.Value.Trim
If CS_ID.LenB = 0 then
theCmd = Cmd.Replace(“CAS_No”, Name)
XmlStr = DefineEncoding(GetTimed(theCmd, TimeOut, Retries), Encodings.UTF8)
XDoc= NEW XmlDocument(XmlStr)
Node = XDoc.DocumentElement
If Node.ChildCount > 0 then CS_ID = Node.FirstChild.FirstChild.Value.Trim
End if
Return CS_ID
End Function
[/code]
[code]Private Function GetTimed(Query as String, TimeOut as integer=-1, Retries as integer = -1) As String
If TimeOut < 0 then TimeOut = TimeOutSec
If Retries < 0 then Retries = me.Retries
Retries = Retries + 1
Dim RtnVal as String
While Retries > 0
RtnVal = Get(Query, TimeOut)
If ErrorCode = 0 then
Return RtnVal
ElseIf ErrorCode = -1 then
Retries = Retries -1
Else
Raise New HTTPSocketException( ErrorCode)
End if
Wend
Return “”
End Function
[/code]