【问题标题】:C# api with request and response in xmlC# api 与 xml 中的请求和响应
【发布时间】:2012-11-26 18:54:57
【问题描述】:

我有 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 生成的 Get 方法。我在这里缺少新对象 [] 的登录名和密码参数,但不知道如何添加它们。

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

【问题讨论】:

    标签: c# xml winforms api soap


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我喜欢你的方式,我尝试生成 WSDL 文件。我使用带有参数 /u 和 /p 的 wsdl.exe,我得到了 WSDL 文件。但是我有一个问题,这种方式我得到了所有需要但没有登录密码的方法。 wsdl.exe 是否有一个参数来使用这些参数制作 WSDL?我在问题中添加了代码。
    • 我发现我必须将这样的凭据添加到我的服务实例中:CredentialCache cache = new CredentialCache(); cache.Add(new Uri(hotelService.Url), "Basic", new NetworkCredential("login", "password")); hotelService.Credentials = cache;Thanks for help
    【解决方案2】:

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

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

    就这么简单。

    【讨论】:

    • 我试过了,但我遇到了错误 401 Unauthorized 的问题(即使我设置了正确的登录名和密码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多