user3916125
user3916125

Reputation: 23

RestSharp PUT XML, RestSharp is sending it as GET?

I am attempting to edit a product using the prestashop API, using RestSharp in C#, using XML. The documentation's instructions are as follows:

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.

I am attempting to edit /customers/1.

My GET calls are working fine to retrieve the data. I am now deserializing the data, editing it as needed, and re-saving to an XML file. All seems to be going well. The only fields I am attempting to change right now are firstname and lastname. The rest of the data is untouched. Here is a copy of the XML I am using:

<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[[email protected]]]></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>

That file is saved as EditedXML.xml. Again, according to the documentation (that I pasted above), to edit a resource I am supposed to use PUT to put the XML back to the same URL (which is /customers/1). So I am using the following code right before creating this topic to try to do just that:

        // 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);

Now comes my problem. I am getting the error (originally in HTML form, I opened it as HTML to post it more readable:)

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.

That error I find VERY confusing for 2 reasons:

1) It seems that even though my request is Method.PUT, it is being read as GET?

2) What it is claiming isn't even true? I have to call a GET function on that same resource to get the initial data?

Just incase anyone would like to see the GET call, here it is:

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

Anyone have any idea what is going on? I'm not sure how to debug this, I'm not sure if the PUT call is working at all, or if the arguments with my PUT call are wrong, or what...

Upvotes: 1

Views: 2946

Answers (2)

user2863597
user2863597

Reputation: 1

"request.AddBody(body);" seems not to be working.

Please check this example on how i'm updating customer.

        // 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);

Upvotes: 0

Richard Friend
Richard Friend

Reputation: 16018

We had a similar problem, we had to use the following code to set the body correctly.

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

Upvotes: 2

Related Questions