我正在尝试使用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; }
}
}
答案 0 :(得分:1)
您需要在 POST正文中发送JSON,但您要将其附加到查询参数中。
改为使用data
,仅对外部结构进行编码:
result=req.post(wsAddr+methodPath,
data=json.dumps({'composite': cType}),
headers=headers)
如果您编码cType
,则会发送一个JSON编码的字符串,其中包含另一个JSON编码的字符串,该字符串又包含您的cType
字典。