2017-01-01 116 views
0

我想獲得一個postJ方法與angularJS 2 http一起工作。角2 http方法失敗

我的REST調用如下:

saveCourse(Course: any) { 
    let url ='https://server/CoursesWebApi/api/courses/insert'; 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    headers.append('Accept', 'application/json'); 
    let options = new RequestOptions({ headers: headers}); 
    return this._http.post(url, { data: Course }, options) 
     .toPromise() 
     .then(res => res.json().data) 
     .catch((err: any) => { 
      console.log(err); 
      return Promise.reject(err); 
     }); 
} 

課程對象,字符串化的時候,看起來是這樣的:

「{」 標題 「:」 測試題」, 「AUTHORID」: 「斯科特 - 阿倫」, 「類別」: 「軟件 建築」, 「CourseLength」: 「2」, 「CourseId」: 「測試ID」}」

我曾經嘗試都將字符串和非串化版本。當我在鉻調試,我得到兩個版本的以下錯誤:

與狀態響應:0網址:空

據我瞭解,狀態0(零)意味着它甚至從未將其發佈到webapi服務器。我啓用了CORS,我在樣本reactJS應用程序中使用了類似的方法,使用axios並調用相同的webapi,並且它可以工作。我安裝了失眠JSON工具,並使用以下JSON格式執行後,它的工作:

{ 「CourseId」:「史蒂夫」, 「的AuthorID」:「科裏 - 房子」, 「標題」 : 「測試題」, 「CourseLength」: 「12:40」, 「類別」: 「測試分類」}

我不知道我做錯了。我的asp.net的WebAPI看起來是這樣的:

[HttpPost] 
[Route("CoursesWebApi/api/courses/insert/")] 
public IActionResult PostCourse([FromBody] Course course) 
{ 
    if (!ModelState.IsValid) 
    { 
     return HttpBadRequest(ModelState); 
    } 

    _context.Course.Add(course); 
    try 
    { 
     _context.SaveChanges(); 
    } 
    catch (DbUpdateException) 
    { 
     if (CourseExists(course.CourseId)) 
     { 
      return new HttpStatusCodeResult(StatusCodes.Status409Conflict); 
     } 
     else 
     { 
      throw; 
     } 
    } 

    return Ok(); 
} 

最後,當我使用Fiddler我看到在網頁API以下錯誤:

HTTP/1.1 400錯誤的請求內容類型:應用程序/ JSON; charset = utf-8 服務器:Kestrel X-Powered-By:ASP.NET Access-Control-Allow-Origin:* 訪問控制允許標題:Content-Type,Accept,X-Requested-With, X -File-Name訪問控制 - 允許 - 方法:GET,POST Date:Sun,01 Jan 2017 16:15:15 GMT內容長度:37

{「」:[「不支持的內容類型''。 「]}

我已經嘗試了許多不同的post方法配置,無濟於事。一直在這工作三天,所以任何幫助表示讚賞。

編輯 我無法解決問題。我的web api使用了新的asp.net核心和EF 7.我使用EF 6和ASP.Net 4.5.2重寫了它,並且它工作正常。我懷疑在我的web api中丟失了一些導致問題的東西。

+0

字符串化的數據'VAR體= JSON.stringify(場)''發送之前_http.post(URL,身體,期權)',檢查以確保API能處理預期的內容類型。同時刪除'[FromBody]'屬性。它被用來從複雜對象 – Nkosi

回答

0

您需要在身體發送數據作爲PostCourse API方法將查找[FromBody]

  //public IActionResult PostCourse([FromBody] Course course) 

下面是一個使用可觀察到的例子:

  public saveCourse(Course: any): Observable<Course> { 
        let url ='https://server/CoursesWebApi/api/courses/insert'; 
        let body: string = JSON.stringify(Course); 
        let headers = new Headers(); 
        let headers.append('Content-Type', 'application/json'); 
        let options = new RequestOptions({ headers: this.headers }); 

        return this.authHttp.put(this.url, body,options) 
         .map((res: Response) => { 
            return res; 
           }) 
          .catch((error: any) => { 
           // Error on post request. 
           return Observable.throw(error); 
         }); 
       } 
1

字符串化數據

var body = JSON.stringify(Course); 

發送

_http.post(url, body, options) 

同時刪除[FromBody]屬性。它用於從複雜對象中提取簡單類型。

參考:Parameter Binding in ASP.NET Web API

的行動將如果您已經啓用了CORS在Chrome嘗試 訪問控制允許來源,*添加到您的標題結束這樣

[HttpPost] 
[Route("CoursesWebApi/api/courses/insert/")] 
public IActionResult PostCourse(Course course) { ... } 
+0

抱歉提取簡單類型。我只是把它作爲一個例子。我更新後的實際網址... – steveareeno

+0

@steveareeno我更新了答案 – Nkosi

+0

不幸的是,同樣的錯誤。 – steveareeno

0

。有類似的問題,這有助於。