Dart 如何利用 SOAP 请求?

How does Dart leverage SOAP requests?

我正在查找如何在 Dart 中执行 SOAP 请求。在查看 HTTPRequest 时,它实际上只提到了 RESTful 服务,并希望确保可以做到这一点。

现在,我有我的服务器、用户名和密码。尝试通过该服务获得成功的身份验证,这样我就有了一个身份验证令牌,我可以在进行后续调用时传递它。

例如在 .NET 中,它似乎执行以下操作,然后将凭据存储在服务器端会话变量中,我将其用作在 Dart 中进行此操作的起点。

// create web service api object
WebServiceAPI api = new WebServiceAPI();

if (!String.IsNullOrEmpty(ConfigurationManager.AppSettings["ProxyUserName"]))
{
    System.Net.NetworkCredential nc = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["ProxyUserName"], ConfigurationManager.AppSettings["ProxyPassword"], ConfigurationManager.AppSettings["ProxyDomain"]);
    System.Net.CredentialCache cc = new System.Net.CredentialCache();
    cc.Add(new Uri(api.Url), "NTLM", nc);
    api.Credentials = cc;
}

api.AuthenticateCredential("api@admin", "admin", 0, 0);
HttpContext.Current.Session["api"] = api;

编辑:我正在添加一些示例数据,这样如果有黑客攻击我们可以利用它来使某些东西正常工作,我们也许可以将其抽象化并通用化。

service asmx file:  
http://127.0.0.1:1337/service.asmx

Method we will be calling: (AuthenticateCredential)
http://127.0.0.1:1337/service.asmx?op=AuthenticateCredential

The sample SOAP request:
POST /service.asmx HTTP/1.1
Host: 127.0.0.1
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://foo.com/bar/320/Default/AuthenticateCredential"

<?xml version="1.0" encoding="utf-8"?>
<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/">
  <soap:Body>
    <AuthenticateCredential xmlns="http://foo.com/barr/320/Default">
      <UserName>string</UserName>
      <Password>string</Password>
      <CurrentSystemLoginID>int</CurrentSystemLoginID>
      <CurrentCustomerID>int</CurrentCustomerID>
    </AuthenticateCredential>
  </soap:Body>
</soap:Envelope>

然后自然而然地,我将mod和string,string,int,int从信封里拿出来。这样凭据就正确了。

据我所知,没有解决方案。 Dart 只有有限的 XML 个包,我还没有看到尝试实现 SOAP 本身。 一种可能的解决方法是委托给用另一种语言编写的服务器,该服务器将 REST 调用转发为 SOAP 调用。

我已经使用 Dart 为 Blackboard 的 Web 服务执行了 SOAP 操作,所以这是可能的。为此,我必须以编程方式为每个请求构建 SOAP 信封。请求本身是使用 http 包的 'post' 方法发送的。

无法说明您的请求应该如何设置,这取决于您尝试访问的 Web 服务。对于 HTTP headers,我发送了一个 'Content-Type' of 'text/xml; charset=utf-8' 和一个 'SOAPAction' header 指定 SOAP 方法。 body 是完整的 SOAP 信封。

您可能需要尝试一下,才能使用服务期望的 format/info 正确构建信封。我使用 xml 包来 parse/interpret 响应。