【问题标题】:RestSharp PUT XML, RestSharp is sending it as GET?RestSharp PUT XML,RestSharp 将其作为 GET 发送?
【发布时间】:2014-08-07 23:33:51
【问题描述】:

我正在尝试使用 prestashop API、在 C# 中使用 RestSharp、使用 XML 来编辑产品。文档说明如下:

To edit an existing resource: GET the full XML file for the resource you want to change (/api/customers/7), edit its content as needed, then PUT the whole XML file back to the same URL again.

我正在尝试编辑 /customers/1。

我的 GET 调用可以正常检索数据。我现在反序列化数据,根据需要对其进行编辑,然后重新保存到 XML 文件。一切似乎进展顺利。我现在尝试更改的唯一字段是名字和姓氏。其余数据保持不变。这是我正在使用的 XML 的副本:

<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
  <customer>
    <id><![CDATA[1]]></id>
    <id_default_group xlink:href="http://heatherfazelinia.com/api/groups/3"><![CDATA[3]]></id_default_group>
    <id_lang xlink:href="http://heatherfazelinia.com/api/languages/1"><![CDATA[1]]></id_lang>
    <newsletter_date_add><![CDATA[2013-12-13 08:19:15]]></newsletter_date_add>
    <ip_registration_newsletter></ip_registration_newsletter>
    <last_passwd_gen><![CDATA[2014-06-20 16:56:30]]></last_passwd_gen>
    <secure_key><![CDATA[6a9b9eab95448d74a026b869d8cd723e]]></secure_key>
    <deleted><![CDATA[0]]></deleted>
    <passwd><![CDATA[6028853eb1033578f7432015042fa486]]></passwd>
    <lastname>newLastName</lastname>
    <firstname>newFirstName</firstname>
    <email><![CDATA[pub@prestashop.com]]></email>
    <id_gender><![CDATA[1]]></id_gender>
    <birthday><![CDATA[1970-01-15]]></birthday>
    <newsletter><![CDATA[1]]></newsletter>
    <optin><![CDATA[1]]></optin>
    <website></website>
    <company></company>
    <siret></siret>
    <ape></ape>
    <outstanding_allow_amount><![CDATA[0.000000]]></outstanding_allow_amount>
    <show_public_prices><![CDATA[0]]></show_public_prices>
    <id_risk><![CDATA[0]]></id_risk>
    <max_payment_days><![CDATA[0]]></max_payment_days>
    <active><![CDATA[1]]></active>
    <note></note>
    <is_guest><![CDATA[0]]></is_guest>
    <id_shop><![CDATA[1]]></id_shop>
    <id_shop_group><![CDATA[1]]></id_shop_group>
    <date_add><![CDATA[2014-08-01 13:20:37]]></date_add>
    <date_upd><![CDATA[2014-08-01 13:20:37]]></date_upd>
    <associations>
      <groups node_type="groups">
        <groups xlink:href="http://heatherfazelinia.com/api/groups/3">
          <id><![CDATA[3]]></id>
        </groups>
      </groups>
    </associations>
  </customer>
</prestashop>

该文件保存为 EditedXML.xml。同样,根据文档(我在上面粘贴的),要编辑一个资源,我应该使用 PUT 将 XML 放回相同的 URL(即 /customers/1)。因此,在创建此主题之前,我正在使用以下代码来尝试做到这一点:

        // PUT call
        var putRequest = new RestRequest("/customers/1", Method.PUT);
        var body = System.IO.File.ReadAllText("EditedXML.xml");
        request.AddBody(body);
        IRestResponse putResponse = client.Execute(putRequest);
        Console.WriteLine("Response: " + putResponse.Content);

现在我的问题来了。我收到错误消息(最初是 HTML 格式,我将其打开为 HTML 以使其更具可读性:)

Method Not Implemented

GET to /api/customers/1 not supported.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

我觉得这个错误非常令人困惑,原因有两个:

1) 似乎即使我的请求是 Method.PUT,它也被读取为 GET?

2) 它所声称的甚至不是真的?我必须在同一资源上调用 GET 函数来获取初始数据?

以防万一有人想看到 GET 调用,这里是:

        request = new RestRequest(Method.GET);
        request.Resource = "/customers/1";
        IRestResponse<customer> newResponse = client.Execute<customer>(request);

有人知道发生了什么吗?我不确定如何调试它,我不确定 PUT 调用是否正常工作,或者我的 PUT 调用的参数是否错误,或者什么......

【问题讨论】:

标签: c# xml restsharp


【解决方案1】:

我们遇到了类似的问题,我们必须使用下面的代码来正确设置 body。

request.AddParameter("application/x-www-form-urlencoded", rawXml, ParameterType.RequestBody);

【讨论】:

    【解决方案2】:

    "request.AddBody(body);"似乎没有工作。

    请查看此示例,了解我如何更新客户。

            // GET customer with id 1
            var client = new RestClient(PrestaShopBaseUrl);
            client.Authenticator = new HttpBasicAuthenticator(PrestaShopAccount, "");
            RestRequest request = new RestRequest("/customers/1", Method.GET);
            IRestResponse response = client.Execute(request);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(response.Content);
            doc.Save(@"Customer.xml");
            // do something with customer file
    
            // init XMLDocument and load customer in it
            doc = new XmlDocument();
            doc.Load(@"Customer.xml");
            // Update (PUT) customer
            request = new RestRequest("/customers/1", Method.PUT);
            request.Parameters.Clear();
            request.AddParameter("text/xml;charset=utf-8", doc.InnerXml, ParameterType.RequestBody);
            response = client.Execute(request);
    

    【讨论】:

    • 您能解释一下这个示例代码是如何回答这个问题的吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多