RestSharp PUT XML, RestSharp отправляет его как GET?

Я пытаюсь отредактировать продукт, используя API prestashop, используя 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[[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>

Этот файл сохраняется как 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 неверны, или что...


person user3916125    schedule 07.08.2014    source источник
comment
Может ли это быть связано с некоторой конфигурацией X-HTTP-Method-Override?   -  person DaniCE    schedule 08.09.2014


Ответы (2)


У нас была аналогичная проблема, нам пришлось использовать следующий код, чтобы правильно установить тело.

request.AddParameter("application/x-www-form-urlencoded", rawXml, ParameterType.RequestBody);
person Richard Friend    schedule 08.09.2014

"запрос.AddBody(тело);" кажется, не работает.

Пожалуйста, проверьте этот пример того, как я обновляю клиент.

        // 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);
person user2863597    schedule 07.09.2014
comment
Не могли бы вы объяснить, как этот пример кода отвечает на вопрос? Спасибо. - person jburns20; 07.09.2014