0

我正在尝试使用 Access 中的 VBA 使 SOAP 登录方法与用于垂直响应的 API 一起使用。他们不通过示例来推广 VBA,他们建议使用他们支持的工具和示例,例如 Java 和 PHP 中的工具和示例。

在他们位于http://developers.verticalresponse.com/api/的 API 文档页面上,他们说端点是: https ://api.verticalresponse.com/wsdl/1.0/VRAPI.wsdl

在他们的 API 文档页面上,描述登录的链接位于 Misc Methods 选项卡上。

输入参数描述为:

username [xsd:string]
password [xsd:string]
session_duration_minutes [xsd:integer] 

我尝试了以下 VBA 代码,其中包含 URL、SOAP 信封和标头的变体。我从来没有得到会话 ID,但总是下面显示无用的文本。

Function VRLogin() As String

   Dim sURL As String
   Dim sEnv As String
   Dim xmlhtp As New MSXML2.XMLHTTP

   sURL = "https://api.verticalresponse.com/wsdl/1.0/VRAPI"

   sEnv = sEnv & "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
   sEnv = sEnv & "  <soap:Body>"
   sEnv = sEnv & "    <username>firstname-lastname@yahoo.com</username>"
   sEnv = sEnv & "    <password>xxxxxxxx</password>"
   sEnv = sEnv & "    <session_duration_minutes>120</session_duration_minutes>"
   sEnv = sEnv & "  </soap:Body>"
   sEnv = sEnv & "</soap:Envelope>"

   xmlhtp.Open "post", sURL, False
   xmlhtp.setRequestHeader "Content-Type", "text/xml"

   xmlhtp.setRequestHeader "SOAPAction", "login"
   xmlhtp.send sEnv

   VRLogin = xmlhtp.ResponseText

 End Function

在 URL 中具有以下变体:

 sURL = "https://api.verticalresponse.com/wsdl/1.0/VRAPI"
 sURL = "https://api.verticalresponse.com/wsdl/1.0/login"
 sURL = "https://api.verticalresponse.com/wsdl/1.0/VRAPI/login"
 sURL = "https://api.verticalresponse.com/wsdl/1.0/VRAPI?method=login"
 sURL = "https://api.verticalresponse.com/login"

响应文本类似于以下内容:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>Not Found</H1>
The requested URL /wsdl/1.0/VRAPI was not found on this server.<P>
</BODY></HTML>

如果 URL 包含类似以下之一的“wsdl”:

 sURL = "https://api.verticalresponse.com/wsdl/1.0/VRAPI.wsdl"
 sURL = "https://api.verticalresponse.com/wsdl/1.0/VRAPI.wsdl/login"
 sURL = "https://api.verticalresponse.com/wsdl/1.0/VRAPI.wsdl?method=login"

响应文本是 wsdl 文档:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:vrns="http://api.verticalresponse.com/1.0/VRAPI" xmlns:vrtypens="http://api.verticalresponse.com/1.0/VRAPI.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:vr="http://www.verticalresponse.com/vrns" targetNamespace="http://api.verticalresponse.com/1.0/VRAPI" name="VRAPI">
  <wsdl:types>
    <xsd:schema targetNamespace="http://api.verticalresponse.com/1.0/VRAPI.xsd">
      <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
      <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
      <xsd:complexType name="ArrayOfCampaignContentLink">
    <xsd:complexContent>
        <xsd:restriction base="soapenc:Array">
            <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="vrtypens:CampaignContentLink[]"/>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>

etc ...

我还尝试将“xsd:”添加到 SOAP 信封中,正如我在一些示例中看到的那样,这没有帮助,例如:

 sEnv = sEnv & "    <xsd:username>firstname-lastname@yahoo.com</xsd:username>"
 sEnv = sEnv & "    <xsd:password>xxxxxxxx</xsd:password>"
 sEnv = sEnv & "    <xsd:session_duration_minutes>120</xsd:session_duration_minutes>"

我修改了标头,例如 Content-type,删除了标头,并制作了一个完全限定的 SOAPAction 标头,如下所示,但没有成功:

 xmlhtp.setRequestHeader "SOAPAction", "https://api.verticalresponse.com/wsdl/1.0/VRAPI/login"

我的 API 访问已启用,但我的结果显示我在身份验证方面还没有走那么远。我认为这是 URL、SOAP 信封或标头中的问题。

从他们为端点提供的信息和带有输入的登录信息来看,我似乎应该能够使用 VBA 设置 API 调用。此问题不应特定于垂直响应 API。

谁能看到我错过了什么?

另外:这可能是一个不同的问题,但它是相关的,需要调用 API。

如何在 SOAP 信封中传递数组?

4

1 回答 1

0

我找到了答案。

我的主要问题是我使用他们在网页上发布的端点 URL 来调用他们的 API。但是我需要在这个 URL 下载这个 .wsdl 文件,然后查看内部并查看调用 API 的真实 URL,即https://api.verticalresponse.com/1.0/VRAPI。.wsdl 文件还告诉您要使用的正确 SOAP 操作名称。您还需要正确指定命名空间。

以下是完成的工作结果。

Function VRLogin() As String

   Dim sURL As String
   Dim sEnv As String
   Dim xmlhtp As New MSXML2.XMLHTTP

   sURL = "https://api.verticalresponse.com/1.0/VRAPI"

   sEnv = "<?xml version=""1.0"" encoding=""UTF-8""?>"
   sEnv = sEnv & "<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ns1=""VR/API/1_0"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:ns2=""http://api.verticalresponse.com/1.0/VRAPI.xsd"" xmlns:SOAP-ENC=""http://schemas.xmlsoap.org/soap/encoding/"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">"
   sEnv = sEnv & "    <SOAP-ENV:Body>"
   sEnv = sEnv & "        <ns1:login>"
   sEnv = sEnv & "            <args xsi:type=""ns2:loginArgs"">"
   sEnv = sEnv & "                <username xsi:type=""xsd:string"">first-last@yahoo.com</username>"
   sEnv = sEnv & "                <password xsi:type=""xsd:string"">xxxxxxxx</password>"
   sEnv = sEnv & "                <session_duration_minutes xsi:type=""xsd:integer"">120</session_duration_minutes>"
   sEnv = sEnv & "            </args>"
   sEnv = sEnv & "        </ns1:login>"
   sEnv = sEnv & "    </SOAP-ENV:Body>"
   sEnv = sEnv & "</SOAP-ENV:Envelope>"

   xmlhtp.Open "post", sURL, False
   xmlhtp.setRequestHeader "Content-Type", "text/xml"

   xmlhtp.setRequestHeader "SOAPAction", "VR/API/1_0#login"
   xmlhtp.send sEnv

   VRLogin = xmlhtp.ResponseText

End Function
于 2013-09-06T02:57:36.253 回答