如何使用Python的请求将复杂类型发布到WCF?

时间:2014-06-30 14:30:17

标签: python wcf python-2.7 python-requests

我正在尝试使用Python的request包来查询WCF Web服务。

我在WCF中创建了一个非常简单的Web服务,遵循默认的VS模板:

[ServiceContract]
public interface IHWService
{

    [OperationContract]
    [WebInvoke(Method="GET", UriTemplate="SayHello", ResponseFormat=WebMessageFormat.Json)]
    string SayHello();

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "GetData", ResponseFormat = WebMessageFormat.Json)]
    string GetData(int value);

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "GetData2", BodyStyle=WebMessageBodyStyle.Bare,  RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

从Python开始,我设法调用前两个并轻松获取数据。

但是,我试图调用第三个,它增加了复杂类型的概念。

这是我的python代码:

import requests as req
import json

wsAddr="http://localhost:58356/HWService.svc"
methodPath="/GetData2"

cType={'BoolValue':"true", 'StringValue':'Hello world'}
headers = {'content-type': 'application/json'}
result=req.post(wsAddr+methodPath,params=json.dumps({'composite':json.dumps(cType)}),headers=headers)

但它不起作用,即如果我在GetDataUsingDataContract方法中对VS进行细分,我看到composite参数为null。我认为这来自解析中的问题,但我不能完全看出错误。

你知道那里有一个明显的错误吗?

你知道如何在解析机制中调试吗?

修改

以下是复杂类型定义:

[DataContract]
public class CompositeType
{
    bool boolValue = true;
    string stringValue = "Hello ";

    [DataMember]
    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }

    [DataMember]
    public string StringValue
    {
        get { return stringValue; }
        set { stringValue = value; }
    }
}

1 个答案:

答案 0 :(得分:1)

您需要在 POST正文中发送JSON,但您要将其附加到查询参数中。

改为使用data,仅对外部结构进行编码:

result=req.post(wsAddr+methodPath,
                data=json.dumps({'composite': cType}),
                headers=headers)

如果您编码cType,则会发送一个JSON编码的字符串,其中包含另一个JSON编码的字符串,该字符串又包含您的cType字典。