Delphi Rest Client与C#Rest服务器通信的问题

时间:2012-08-03 08:20:57

标签: wcf delphi rest delphi-2009

我正在编写一个REST WCF服务,并且它正在为来自C#客户端的连接工作,但是在通过Delphi 2009客户端进行连接时遇到了问题。我遇到的问题是PUT请求,它看起来(暂时)如下所示。它需要一个包含文档对象的XML请求。

    [WebInvoke(UriTemplate = "Document/{id}", Method = "PUT", RequestFormat=WebMessageFormat.Xml)]
    public void UpdateDocument (string id, Document document)
    {
        Document doc = document;

        // this should update or something!
        Console.WriteLine(doc.Id);
    }

当我尝试通过我的Delphi客户端调用它时(如下所示),我得到一个'错误请求'。奇怪的是,如果我发送一个空文档,则会收到请求,但显然没有数据。

   ...

     msg := '<?xml version="1.0"?>' +
    '<Document>' +
    '<Id>123456788888</Id>' +
    '</Document>';

  XMLDocument1.LoadFromXML(msg);
  xmlStream := TMemoryStream.Create;
  idHttp1.Request.ContentType := 'application/xml';
  XMLDocument1.SaveToStream(xmlStream);
  url := 'http://localhost:50435/service1/Document/12345678';
  result := idHttp1.Put(url, xmlStream);
  ShowMessage (result);

  ...

任何想法,因为我现在有点迷失了!

由于

2 个答案:

答案 0 :(得分:0)

URI到服务器方法的映射不正确。根据默认映射,PUT请求将调用AcceptDocument方法,POST请求将调用UpdateDocument方法。

http://docwiki.embarcadero.com/RADStudio/en/REST

同样传递TStream作为参数也有可能遇到困难。你有可能使用JSON吗?我不确定Delphi 2009是否支持JSON。

编辑: 引自Delphi documentation

  

默认情况下,“update”的前缀被分配给任何调用的方法   用POST。同样,'cancel'的前缀用于DELETE   请求和'accept'前缀用于PUT请求。这个   通过在方法周围加上引号可以避免前缀   名称

以上引用适用于Delphi。也许也适用于WCF。

答案 1 :(得分:0)

根据我上面的评论,安装Fiddler让我看看webservice输出的实际页面,这有助于拥有示例XML和json结构。我错过了对象的命名空间,所以我猜WCF结束时不知道要翻译什么,将消息更改为以下内容使其工作:

msg := '<?xml version="1.0"?>' +
'<Document xmlns="http://schemas.datacontract.org/2004/07/Contracts.Contracts">' +
'<Id>123456788888</Id>' +
'</Document>';