2014-06-30 51 views
0

我想使用Python的request包來查詢WCF Web服務。如何使用Python的請求將複雜類型發佈到WCF?

我在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) 

但它不工作,即,如果我把細目VS在GetDataUsingDataContract方法,我看到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

您需要在POST體發送JSON,但要將它連接到查詢參數來代替。

使用data代替,只有編碼結構:

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

如果編碼cType,你會發送包含另一個JSON編碼字符串,又包含一個JSON編碼字符串,你cType字典。

+0

實際上,現在類型不再爲null,但兩個字段都沒有初始化。我將自定義類型定義添加到問題 – SRKX

+0

@SRKX:我不知道JSON如何映射到WCF類型。 –

+0

找到了!只需在WebInvoke屬性中設置'BodyStyle = WebMessageBodyStyle.WrappedRequest'(而不是Bare)即可。非常感謝。 – SRKX