Я работаю с 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
Любая помощь по этому вопросу будет очень признательна!
К сожалению, я не знаком с F #, но, возможно, документы http://doc.prestashop.com/display/PS16/Using+the+PrestaShop+Web+Service и Lib (особенно редактировать() метод) https://github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/PSWebServiceLibrary.php поможет вам –
У вас есть пример кода на каком-то другом языке, который работает? –
https://github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/examples/Update.php работает –