【发布时间】:2016-01-17 02:31:17
【问题描述】:
我正在使用Prestashop 网络服务。我正在尝试向 API 发送 PUT(更新)请求,但没有成功。我的请求似乎以“错误”的方式设置(即不是服务器期望的方式)因为 Prestashop 是开源的,所以我查看了源代码,特别是当它收到 PUT 请求时它会以下(我不写php代码):
$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> 但我不知道该放在哪里,它应该在请求正文中还是嵌入在 url 中?当您使用Content-Type = text/xml 发送请求时,“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 添加到网址(即使在文档中他们说这不是必需的):
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
具体来说,我正在尝试更新订单的current_state 节点的值。获取数据并对其进行修改按预期工作,但发送修改后的数据似乎不起作用,我仍然收到404: Not found 错误
对此的任何帮助将不胜感激!
【问题讨论】:
-
不幸的是我不熟悉 F#,但也许 docs doc.prestashop.com/display/PS16/… 和 lib(尤其是 edit() 方法)github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/… 会帮助你
-
您有其他可用语言的示例代码吗?
-
@SergiiP,感谢您的回答,
edit()方法在这里没有多大帮助,因为它是从其他地方调用的(我不知道具体从哪里调用)。我已经看到了他们给出的更新“示例”,不幸的是,它仅在您使用服务器本身的 API 时才有效,因为他们在文件中实例化PrestashopWebservice类并发出一些 html。 -
您是否有一个应用程序或 PHP 示例或其他可以让您至少在实验室条件下工作的东西?如果是这样,您能否将这两个请求都通过 Fiddler 并查看它们有何不同?这将使您了解问题所在。
标签: php xml rest f# prestashop