0

我有 API,我需要以 XML 格式发送请求以获取响应(也以 XML 格式)。我认为这被称为 SOAP API,但我不确定,所以我在这里插入我发送的内容。

请求应如下所示:

<request>
    <login>name</login>
    <password>password</password>
    <hotId>1</hotId>
</request>

我应该将它发送到这个 url 以获得响应:https://api.xxx.com/v1/hotel/get

这是如何将其与 php 和 curl 一起使用:

<?php
$login    = '*****';
$password = '*****';

$request =
'<?xml version="1.0"?>' . "\n" .
'<request>' .
    '<login>' . htmlspecialchars($login) . '</login>' .
    '<password>' . htmlspecialchars($password) . '</password>' .
    '<hotId>1</hotId>' .
'</request>';

$ch = curl_init('https://api.xxx.com/x1/hotel/get');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

echo "<pre>\n";
echo htmlspecialchars($response);
echo "</pre>";

那么在 C# 中如何做到这一点的最佳方法是什么?

我尝试了类似的方法,但它不起作用,我认为必须有更好的方法。

    System.Net.WebRequest req = System.Net.WebRequest.Create(@"https://api.xxx.com/v1/hotel/get");

    req.ContentType = "text/xml";
    req.Method = "POST";

    byte[] bytes = System.Text.Encoding.ASCII.GetBytes("<?xml version=\"1.0\"?><request><login>login</login><password>pass</password><hotId>1</hotId></request>");
    req.ContentLength = bytes.Length;
    Stream os = req.GetRequestStream();
    os.Write(bytes, 0, bytes.Length);


    System.Net.WebResponse resp = req.GetResponse();
    if (resp == null) return;
    System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());

    string responsecontent = sr.ReadToEnd().Trim();

编辑:获取使用 wsdl.exe 生成的方法。我在这里缺少新对象 [] 的登录名和密码参数,但不知道如何添加它们。

[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://api.xxx.com/v1/hotel/get", RequestNamespace="http://api.xxx.com/v1/hotel/", ResponseNamespace="http://api.xxx.com/v1/hotel/", Use=System.Web.Services.Description.SoapBindingUse.Literal)]
[return: System.Xml.Serialization.XmlElementAttribute("hotel")]
public hotelType get(int hotId) {
    object[] results = this.Invoke("get", new object[] {
                hotId});
    return ((hotelType)(results[0]));
}

构造函数:

public HotelService() {
    this.Url = "http://api.xxx.com/v1/hotel/";
}
4

2 回答 2

3

您描述的通信模式是 SOAP 服务。

在 .NET 中,使用其中一项服务的最简单方法是拥有 WSDL(Web 服务定义语言)文件。此文件包含有关公开的 Web 服务的元数据:它在哪里、可用的方法、方法生成和接受的数据类型、应该使用哪些传输和/或安全层等。

您应该能够从 Web 服务提供商处获得 WSDL;您可以下载它或从其托管位置引用它。一旦你有了这个文件或知道它的位置,你所要做的就是进入VS,右键单击包含需要使用Web服务的代码的项目,然后单击“添加服务引用...”。然后输入 WSDL 的位置(这旨在查找托管的 WSDL 文件,而不是您托管的文件,但它可以双向工作),您应该会看到有关该服务的信息。单击确定,VS 将自动生成代理类和所需的任何自定义数据类型,当调用它们时将形成并传输正确的 SOAP 消息并等待响应。

然后,您只需新建一个服务实例并像使用任何类一样使用它。

于 2012-11-26T19:02:32.217 回答
0

实际上,我已经用 SOAP 做过类似的事情,这就是我让它工作的方式。首先,右键单击您的项目并选择“添加服务引用”。输入 SOAP Web 服务的 URL,Visual Studio 应该会自动生成您需要的所有方法。从那里,通过添加将其包含在您当前的课程中using namespace.servicereferencename;。查看服务引用的对象浏览器并找出客户端名称。然后你可以这样做:

string request = xmlrequest;
SOAPclient client = new SOAPclient();
string response = client.methodName(request);

就这么简单。

于 2012-11-26T19:05:53.977 回答