带有xml请求和响应的C#api

时间:2012-11-26 18:54:57

标签: c# xml winforms api soap

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

请求应如下所示:

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

我应该将其发送到此网址以获得回复: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生成的方法。我在这里缺少登录和密码params到新对象[]但不知道如何添加它们。

[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/";
}

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

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

就这么简单。