2017-08-16 86 views
4

我想發佈一些JSON到Web API .NET的核心,但由於某種原因,這始終是空不管下面我有試過見代碼。角度支柱JSON到.NET的核心Web API爲空(更新)

這是我的.NET的核心Web API代碼

[Produces("application/json")] 
    [Route("api/v1/Issues")] 
    [Authorize] 
    [EnableCors("AllowCors")] 
    public class IssuesController : Controller 
    { 
     [HttpPost] 
     public IActionResult PostIssues([FromBody] string issue) 
     { 
      //some code to desirialize 
     } 
    } 

,這就是我如何嘗試通過角後(注意適當的服務被加載)

public addIssue(issue) { 
    const headers = new Headers(); 
    this.authService.getToken().toPromise().then(t => { 
     headers.append('Authorization', `Bearer ${t.toString()}`); 
     headers.append('Content-Type', 'application/json') 
     this.http.post(`${this.baseUrl}/v1/issues`, issue, { 
     headers: headers 
     }).toPromise() 
     .then(res => { 
      console.log(res.json()); 
     }); 
    }); 
    } 

我曾嘗試改變後到

this.http.post(`${this.baseUrl}/v1/issues`, JSON.stringify(issue)) 

甚至

this.http.post(`${this.baseUrl}/v1/issues`, {'issue', JSON.stringify(issue)}) 

但似乎沒有任何人有任何想法,爲什麼會發生這種情況? 澄清在API上收到的string issue始終爲空。 下面是當我達到你所看到的請求負載不爲空,服務器的全成響應,但到達網頁API爲空 enter image description here

更新1如果可能的話 好吧,我想做一點需要說明實驗相同的代碼爲4.5框架,而不是一個.NET的核心工作正常不過我嘗試了.NET的核心做的,工作是創建一個名爲Foo類見下文

public class Foo 
    { 
     public string Name { get; set; } 
     public string Json { get; set; } 
    } 

並修改我的控制器接受這個對象

[HttpPost] 
    public IActionResult PostIssues([FromBody] Foo issue) 
    { 
     Debug.Write(issue); 
     return Ok(issue); 
    } 

以及我的角度項目通過一項類似的格式身體

public addIssue(issue) { 
const headers = new Headers(); 
this.authService.getToken().toPromise().then(t => { 

    headers.append('Authorization', `Bearer ${t.toString()}`); 
    headers.append('Content-Type', 'application/json'); 

    this.http.post(`${this.baseUrl}/v1/issues`, {'name' : 'name', 'json': JSON.stringify(issue)}, { 
    headers: headers, 
    withCredentials: true 
    }).toPromise() 
    .then(res => { 
     console.log(res.json()); 
    }); 
}); 

}

這設法順利通過並綁定到控制器 enter image description here

這是爲什麼確定但不能直接傳遞Json?爲什麼我的原始代碼可以在4.5框架上運行,但不能在.net內核上運行?

+0

你在'PostIssues()'中返回什麼? JS中'issue'的價值是什麼? – chakeda

+0

我回來了好(desieralized問題),但我不明白爲什麼這將是一個問題,這個問題是,我的帖子JSON收到空API上 – Harry

+0

啊好吧 - 我以爲你的意思是'res.json()'是空值。你的客戶請求是什麼樣的(來自Fiddler或開發工具)? – chakeda

回答

3

我會盡力回答您的問題。在API收到

串問題始終是空

傳遞一個JSON這總是會得到你一個空,因爲你正在試圖綁定到一個原始數據類型。爲了解決這個問題,你有兩個選擇

綁定到一個模型(視圖模型)

當你的參數是一個類,ASP將這一類,你通過了JSON數據綁定就是爲什麼你能得到的name數據。 根據你的更新,你可能會走這條路。

更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

現在你可能會奇怪,爲什麼你會創造只是爲了你的API使用的類時,參數只是一個字符串?如果你想在你的API僅僅使用string那麼你可以做到這一點

使用傳遞數據FormData

您需要更改API這樣

public IActionResult PostIssues(string issue){..} 

你不需要在這裏指定[FromBody]

在您的客戶端,

public addIssue(issue) { 
    const headers = new Headers(); 
    this.authService.getToken().toPromise().then(t => { 
     headers.append('Authorization', `Bearer ${t.toString()}`); 
    // new code here 
    var formData = new FormData(); 
    formData.append('issue',issue); //you need to specify the parameter name here. 
     this.http.post(`${this.baseUrl}/v1/issues`, formData, { 
     headers: headers 
     }).toPromise() 
     .then(res => { 
      console.log(res.json()); 
     }); 
    }); 
    } 

希望這有助於。

+0

謝謝,這是有道理的,並涵蓋我將標記爲正確的。 – Harry

0

,因爲它是一個字符串,你可以通過它在url

${this.baseUrl}/v1/issues?issue=yourVarIssue 
+0

我想避免這種情況,因爲那裏可能會有一對夫婦長的字符串,並且從過去的經驗來看,如果長度超過一定的大小,可能會導致很多問題。 – Harry

+0

基於類似的問題,我認爲你必須添加這個標題:{'Content-Type':'application/x-www-form-urlencoded'} https://stackoverflow.com/questions/45719017/angular -post -json-to-net-core-web-api-is-null/45719221?noredirect = 1#comment78396673_45719221 –

+0

如果我這樣做,我得到一個415錯誤,如果我把它留作應用程序/ json它到達api,但null – Harry