2017-08-08 142 views
1

我有一個C#WebAPI(我是web API的新手),它可以正常工作,因爲我可以執行GET & Postman和另一個使用HttpClient的C#程序的POST請求。將JSON嵌套對象傳遞到Post()方法 - C#WebAPI

POST方法是「工作」,因爲我把一個斷點放入它來檢查它是否在我發送POST請求時觸發它的代碼。

「另一個C#程序」負責從數據庫中讀取一些數據,將其序列化(使用JSON.Net)&將其發送到Web API。

在Web API中,我想使用JSON序列化對象(其中包含嵌套對象)來重建序列化和發送之前所具有的同一個對象。每個用於創建此對象的類都存在於webAPI程序中。

我認爲我只需要接收JSON字符串,然後將其反序列化到我的對象,但我不會獲得這個字符串,而是將'null'作爲post參數。

我的代碼:

的WebAPI配置

public static class SHPC_APIConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "ShPcAPI", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new {id = RouteParameter.Optional} 
     ); 

     // Configure JSON formatter 
     var jsonFormatter = config.Formatters.JsonFormatter; 
     jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    } 
} 

控制器

public class DataController : ApiController 
{ 
    public string Get() 
    { 
     return "Hello world!"; 
    } 

    public HttpResponseMessage Post([FromBody] string value) 
    { 
     var data = JsonConvert.DeserializeObject<Data>(value); 
     Console.WriteLine(value != string.Empty ? "OK" : "KO"); 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

執行GET請求的作品,我得到我期望的答案。無論我從Postman還是從其他C#程序請求。

但是,當我嘗試執行POST請求時,請求的參數值始終爲空,無論我要求從Postman還是從我的其他C#程序。

+0

只需使用正確的類型作爲參數即可。 JSON反序列化應該作爲框架的一部分發生。另外,如果可能的話使用WebApi 2,使用屬性方法定義路由而不是在config中註冊路由更好。 –

+0

@DarrenYoung當你說出正確的類型時,你是在談論我想將JSON反序列化的類型「數據」?如果是這樣,我已經試圖期望數據作爲Post()方法的參數而不是字符串,但是它將Data對象設置爲所有默認值/空值... – Arnaud

回答

2

在你WebApiConfig文件到App_Start嘗試把這個在註冊功能:

var settings = 
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; 

這將序列化JSON所有的答覆。

+0

非常感謝您的理解!你知道爲什麼我在註冊函數中的jsonFormatter var不能完成這項工作嗎? – Arnaud

+0

這是因爲它可能是試圖返回一個JSON到一個XML響應 –

+0

好吧,非常感謝您的答覆我被困在這個小時。 – Arnaud