2015-10-18 6 views
1

Я работаю с Prestashop веб-сервисом. Я пытаюсь отправить запрос PUT (обновление) в API, но не повезло. Мой запрос, похоже, настроен на «неправильный» способ (т. Е. Не так, как ожидает сервер). Поскольку Prestashop является открытым исходным кодом, я взглянул на исходный код, особенно когда он получает запрос PUT, он делает следующее (Я не пишу PHP-код):Как отправить этот запрос PUT на prestashop?

$input_xml = null; 
// if a XML is in PUT or in POST 
if (($_SERVER['REQUEST_METHOD'] == 'PUT') || ($_SERVER['REQUEST_METHOD'] == 'POST')) { 
    $putresource = fopen("php://input", "r"); 
    while ($putData = fread($putresource, 1024)) { 
     $input_xml .= $putData; 
    } 
fclose($putresource); 
    } 
if (isset($input_xml) && strncmp($input_xml, 'xml=', 4) == 0) { 
    $input_xml = substr($input_xml, 4); 
} 

Из кода выше, я понял, что мои данные должны выглядеть следующим образом: xml=<data><here></here></data>, но я не знаю, куда поместить это, она должна быть в запросе -body или встроенный в URL-адрес? является ли «xml =» неявным, когда вы отправляете запрос с Content-Type = text/xml? Я попробовал разные комбинации запроса и по-прежнему получал ту же ошибку 404. Я попытался это:

let updateOrderState (orderId:int64) (stateId:int64) (credentials:AuthInfo) = 
    // url looks like this: http://www.webstoreexample.com/entity/id 
    let auth = BasicAuth credentials.Key "" 
    let orderApi = credentials.Api + "/orders/" + orderId.ToString(); 
    let orderAsXml = Http.RequestString(orderApi, httpMethod = "GET", headers = [auth]) 
    let xml = Order.Parse(orderAsXml).XElement // at this point, I have the data 
    xml.Element(XName.Get("order")).Element(XName.Get("current_state")).SetValue(stateId) // field 'current_state' gets modified 
    let xmlData = xml.ToString() 
    // HERE the put request 
    Http.RequestString(url = credentials.Api + "/orders", 
         headers = [ auth; 
            "Content-Type","text/xml" ],   
         httpMethod= HttpMethod.Put, 
         body= HttpRequestBody.TextRequest(xmlData)) 

Вариации на PUT-запрос не работает, как хорошо, здесь я изменил тело запроса от TextRequest в FormValues:

Http.RequestString(url = credentials.Api + "/orders", 
        headers = [ auth; 
           "Content-Type","text/xml" ],   
        httpMethod= HttpMethod.Put, 
        body= HttpRequestBody.FormValues ["xml", xmlData]) // xml=xmlData 

Другая вещь, которую я пытался это добавляющий id в URL (даже то в документации они говорят, что это не обязательно):

Http.RequestString(url = credentials.Api + "/order/" + orderId.ToString(), // added the id to the url 
        headers = [ auth; 
           "Content-Type","text/xml" ],   
        httpMethod= HttpMethod.Put, 
        body= HttpRequestBody.FormValues ["xml", xmlData]) // xml=xmlData 

в частности, я Тринг обновления значения O f current_state узел заказа. Получение данных и их изменение работают, как ожидалось, но отправка измененных данных, похоже, не работает, и я по-прежнему получаю ошибку 404: Not found

Любая помощь по этому вопросу будет очень признательна!

+0

К сожалению, я не знаком с F #, но, возможно, документы http://doc.prestashop.com/display/PS16/Using+the+PrestaShop+Web+Service и Lib (особенно редактировать() метод) https://github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/PSWebServiceLibrary.php поможет вам –

+0

У вас есть пример кода на каком-то другом языке, который работает? –

+0

https://github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/examples/Update.php работает –

ответ

0

Хорошо, я только что протестировал его с помощью library и example, которые я даю в комментариях, также я повторяю те же запросы, используя CURL с одинаковыми положительными результатами, поэтому нет никакого языка программирования PHP. Я думаю, вам нужно просто повторить те же заголовки/тело в вашем приложении.

HTTP REQUEST HEADER 
PUT /16011/api/orders/8 HTTP/1.1 
Authorization: Basic TlpCUEJKTkhaWFpFMzlCMVBDTkdTM1JQN0s2NTVVQ0Y6 
Host: localhost 
Accept: */* 
Content-Length: 2411 
Content-Type: application/x-www-form-urlencoded 

XML SENT 
<?xml version="1.0" encoding="UTF-8"?> 
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink"> 
<order> 
    <id>8</id> 
    <id_address_delivery xlink:href="http://localhost/16011/api/addresses/5">5</id_address_delivery> 
    <id_address_invoice xlink:href="http://localhost/16011/api/addresses/5">5</id_address_invoice> 
    <id_cart xlink:href="http://localhost/16011/api/carts/8">8</id_cart> 
    <id_currency xlink:href="http://localhost/16011/api/currencies/1">1</id_currency> 
    <id_lang xlink:href="http://localhost/16011/api/languages/1">1</id_lang> 
    <id_customer xlink:href="http://localhost/16011/api/customers/2">2</id_customer> 
    <id_carrier xlink:href="http://localhost/16011/api/carriers/3">3</id_carrier> 
    <current_state xlink:href="http://localhost/16011/api/order_states/2" notFilterable="true">10</current_state> 
    <module>bankwire</module> 
    <invoice_number>0</invoice_number> 
    <invoice_date>0000-00-00 00:00:00</invoice_date> 
    <delivery_number>0</delivery_number> 
    <delivery_date>0000-00-00 00:00:00</delivery_date> 
    <valid>0</valid> 
    <date_add>2015-09-17 08:29:17</date_add> 
    <date_upd>2015-10-20 03:45:13</date_upd> 
    <shipping_number notFilterable="true"></shipping_number> 
    <id_shop_group>1</id_shop_group> 
    <id_shop>1</id_shop> 
    <secure_key>45838497c9182b0d361473894092de02</secure_key> 
    <payment>Bank wire</payment> 
    <recyclable>0</recyclable> 
    <gift>0</gift> 
    <gift_message></gift_message> 
    <mobile_theme>0</mobile_theme> 
    <total_discounts>0.000000</total_discounts> 
    <total_discounts_tax_incl>0.000000</total_discounts_tax_incl> 
    <total_discounts_tax_excl>0.000000</total_discounts_tax_excl> 
    <total_paid>24.450000</total_paid> 
    <total_paid_tax_incl>24.450000</total_paid_tax_incl> 
    <total_paid_tax_excl>23.510000</total_paid_tax_excl> 
    <total_paid_real>0.000000</total_paid_real> 
    <total_products>16.510000</total_products> 
    <total_products_wt>17.170000</total_products_wt> 
    <total_shipping>7.280000</total_shipping> 
    <total_shipping_tax_incl>7.280000</total_shipping_tax_incl> 
    <total_shipping_tax_excl>7.000000</total_shipping_tax_excl> 
    <carrier_tax_rate>4.000</carrier_tax_rate> 
    <total_wrapping>0.000000</total_wrapping> 
    <total_wrapping_tax_incl>0.000000</total_wrapping_tax_incl> 
    <total_wrapping_tax_excl>0.000000</total_wrapping_tax_excl> 
    <round_mode>2</round_mode> 
    <conversion_rate>1.000000</conversion_rate> 
    <reference>ECHCBFWGR</reference> 
<associations></associations> 
</order> 
</prestashop> 
+0

Спасибо за ваш ответ, я воспроизвел те же заголовки (см. Здесь) https://jsfiddle.net/w51re4bf/, и я все еще получаю '404 Error' –

+0

Теперь я попробовал веб-сервис Php, я смог отправлять запросы GET и который работал так, как ожидалось, запрос PUT был отправлен успешно, но на этот раз я получил другую ошибку, а именно «Bad ID». Пожалуйста, взгляните на этот https://jsfiddle.net/rbq5jza5/2/ –

+0

и у вас есть права на редактирование для этого ключа api? и т. д. –

Смежные вопросы