如何POST两个字符串?

时间:2012-04-07 11:27:13

标签: c# wcf web-services rest

我正在尝试为我的AddTagtoGroup创建一个POST方法

看起来像这样(虽然似乎仍然混淆为字符串组似乎没有使用):

    List<Group> Groups = new List<Group>();
    List<Tag> tags = new List<Tag>();
    public void AddTagtoGroup(string group, string tag)
    {
        var result = Groups.Where(n => String.Equals(n.GroupName, tag)).FirstOrDefault();
        if (result != null)
        {
            result.Tags.Add(new Tag() { TagName = tag });
        }
    }  

我的帖子方法看起来像这样,但我不确定要放在uri模板中的内容?

        [OperationContract]
        [WebInvoke(Method = "POST",
 BodyStyle = WebMessageBodyStyle.Bare, 
RequestFormat = WebMessageFormat.Xml, 
ResponseFormat = WebMessageFormat.Xml, 
UriTemplate = "/AddTagtoGroup{group}{tag}")]
        void AddTagtoGroup(string group, string tag);

或者我对GET感到困惑,任何东西都可以进入uri模板?

在运行我的帖子时,只有bare作为邮件格式,我收到的错误是说我的操作合同必须换行,所以我将其更改为WebMessageFormat.Wrapped

我刚刚设置为UriTemplate="/AddTagtoGroup"的uri模板运行但是我不确定我是否可以实际发布任何内容,或者我可以吗?就像我说GET&amp; POST。

2 个答案:

答案 0 :(得分:1)

你的URI中需要在group和tag之间有一个分隔符,否则它是不明确的(不可能分辨出第一个字符串结束的位置和第二个字符串的开头)。将UriTemplate调整为“/ AddTagToGroup / {group} / {tag}”。

此外,WebInvoke默认为POST,因此您不需要Method="POST",而且我不确定您为何需要所有其他属性。

答案 1 :(得分:1)

如果你想要安息,你有几个选择。

如果它只是字符串,您需要按如下方式定义它。请注意,不需要数据合同。缺点是,如果你有100个标签,你将不得不拨打100个电话。

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/groups/{group}/tags")
public void AddTagsToGroup(string groupName, string tag)
{
  // do what you need to do
}

要批量处理它们,您可以执行以下操作:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/groups/{group}/tags")
public void AddTagsToGroup(string groupName, string[] tags)
{
  // do what you need to do
}

现在,这也存在一些问题,特别是如果您希望自己的有效负载是自我描述的:

<Tags> 
   <Tag>tag1</Tag>
   <Tag>tag2</Tag>
</Tags>

在这种情况下,我会像您一样定义数据合约标签,并按如下方式发布:

[WebInvoke(Method = "POST", UriTemplate = "/groups/{group}/tags")
public void AddTagsToGroup(string groupName, Tag[] tags)
{
  // do what you need to do
}

或者按如下方式包装标签请求:

[CollectionDataContract]
public class Tags : List<Tag>
{

}

并按如下方式定义签名:

[WebInvoke(Method = "POST", UriTemplate = "/groups/{group}/tags")
public void AddTagsToGroup(string groupName, Tags tags)
{
  // do what you need to do
}

选择真的是你的。 WCF REST帮助页面将为您提供要发布的确切格式。