prestashop中的delphi XE8 REST接口PUT

埃里克·范·高普(Erik Van Gorp)

我正在尝试通过REST接口更新Prestashop中的制造商。到目前为止,我已经能够获取信息,但是当我尝试进行PUT时,总是出现HTTP 500错误。

try
    Memo1.Text := '<prestashop><manufacturer><id><![CDATA[804]]></id><name><![CDATA[DisneyLand]]></name></manufacturer></prestashop>';

    RESTRequest1.Params.Clear;
    //authentication does not work with PUT, use token as suffix....
    RESTClient1.Authenticator := nil; //SimpleAuthenticator1;//
    //SimpleAuthenticator1.UserNameKey := 'ws_key';
    //SimpleAuthenticator1.UserName := 'HEREIGOESTHETOKEN';
    RESTRequest1.Resource := 'manufacturers';
    RESTRequest1.ResourceSuffix := '?ws_key=HEREIGOESTHETOKEN';
    RESTRequest1.Method := rmPut; //update
    RESTClient1.BaseURL := 'http://localhost/prestashop/api';
    RESTRequest1.Params.AddItem('id', '804' ,pkGETorPOST , [], ctTEXT_PLAIN);
    RESTRequest1.Params.AddItem('putXml', Memo1.Text,
                                pkGETorPOST , [], ctAPPLICATION_X_WWW_FORM_URLENCODED);

    RESTRequest1.Execute;

    Memo1.Lines.Clear;
    Memo1.Lines.Add(RESTResponse1.Content);
  except
    on E : Exception do
    begin
      Memo1.Lines.Clear;
      Memo1.Lines.Add('Exception class name = '+E.ClassName);
      Memo1.Lines.Add('Exception message = '+E.Message);
    end;
  end;

我尝试了其他TRESTRequestParameterKind可能性,但无济于事。

有人尝试过吗?

埃里克·范·高普(Erik Van Gorp)

更新:在使用Wireshark监视我的网络后,我注意到如果我在以前的任何地方使用TSimpleauthenticater组件,则xml始终附加ws_key值,从而导致500个服务器错误。即使我清除所有SimpleAuthenticator设置并将Clients身份验证器设置为nil,也会发生这种情况。

在正文中指定xml时,我还必须将内容类型设置为ctTEXT_XML iso ctAPPLICATION_X_WWW_FORM_URLENCODED。

以下代码有效:

procedure TForm1.BtnNewMfgClick(Sender: TObject);       //new
var
  aNode, aCNode, aCCNode : IXMLNode;
  i,j : integer;
  aXml : string;
begin
  RESTRequest1.Params.Clear;
  RESTClient1.Authenticator := nil;
  SimpleAuthenticator1.UserNameKey := '';
  SimpleAuthenticator1.UserName := '';

  RESTClient1.BaseURL := 'http://localhost/prestashop/api';
  RESTRequest1.Resource := 'manufacturers';
  RESTRequest1.ResourceSuffix := '?schema=blank&ws_key=HEREGOESMYKEY';
  RESTRequest1.Method := rmGet;
  RESTRequest1.Execute;
  aXml := RESTResponse1.Content;
  XMLDocument1.LoadFromXML(aXml);

  aNode := XMLDocument1.ChildNodes.FindNode('prestashop');
  if assigned(aNode)
  then begin
    for i := 0 to aNode.ChildNodes.Count-1 do
    begin
      aCNode := aNode.ChildNodes.Get(i);
      for j := 0 to aCNode.ChildNodes.Count-1 do
      begin
        aCCNode := aCNode.ChildNodes.Get(j);
        if aCCNode.NodeName = 'id' then aCCNode.NodeValue := ''; //cannot pass id at create
        if aCCNode.NodeName = 'active' then aCCNode.NodeValue := '1' ;
        if aCCNode.NodeName = 'name' then aCCNode.NodeValue := 'New Brand';
      end;
    end;
  end;

  XmlDocument1.SaveToXML(aXml);

  RESTRequest1.ClearBody;
  RESTRequest1.AddBody(aXml, ctTEXT_XML);
  RESTRequest1.ResourceSuffix := '?ws_key=HEREGOESMYKEY';

  RESTRequest1.Method := rmPost;
  RESTRequest1.Execute;

  //new id is returned in the contents XML id tag
  Memo1.Lines.Clear;
  Memo1.Lines.Add(RESTResponse1.Content);
end;

尽管此方法在测试中有效,但我仍在对其进行进一步调查,因为在生产中它必须在https://上工作,因此不会暴露密钥。

简而言之:Simpleauthenticator仅适用于GET和DELETE。一旦使用,PUT和POST将永远无法使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Delphi XE8加载PDF文件

用于delphi XE8的多设备Bcrypt库

使用Delphi XE8进行XSLT转换的替代方法

Delphi XE8 idHttp Erromessage文本编码错误

Delphi Xe8,如何获取android设备令牌?

降序列表框项目Delphi XE8

在显示模态的Delphi XE8上将浮点除以零

Delphi XE8 FMX Android 和 USSD 代码

Delpi XE8 REST客户端和HubSpot

如何在XE8中禁用Castalia?

当“ |”时,IDE挂起。在源代码中。这是Delphi XE8中的错误吗?

如何知道Delphi XE8中位图的比例尺?

如何防止应用程序在Delphi XE8中进入睡眠模式

如何在Delphi XE8中添加64位目标平台?

TList <T>中的Delphi XE8错误,需要解决方法

在Delphi XE8的移动编译器中哪些指针相关的东西不起作用?

与其他Delphi版本相比XE8中的System.Generics.Collections差异

Delphi XE8中的数字分区算法生成器

如何使用delphi XE8 firemonkey项目更新数据库?

我该如何配置新的Delphi XE8 Editor起始视觉提示?

Delphi-自XE8起如何正确注册图形类?

Delphi XE8在应用程序启动时优雅地处理ETetheringException

Delphi xe8,无法重命名组件xxx,该组件以祖先形式引入

Delphi XE8更新1-找不到随机文件

DELPHI XE8:OnCreate事件期间未刷新Android上的TRectangle

Delphi XE8 Firemonkey iOS应用程序仅通过TEdit崩溃

优雅地关闭了Indy TCPServer移动应用程序Delphi XE8

将数据从TIdTCPClient发送到FMX中的TServerSocket不适用于Delphi XE8

如何使用Delphi XE8使用SHA-3 / 256对字符串进行哈希处理?