Не работает метод Angular2 / 4 post - PullRequest
0 голосов
/ 29 мая 2018

Я новичок в angular2 / 4 web api.Я хочу сохранить некоторые данные в базу данных, используя угловые 4 веб-API HTTP.Когда я вызываю метод GET из angular, он работает нормально, но не работает с методом POST.Я получаю 415 Unsupported Media Type. Все время, но когда я использую почтальон, метод post работает нормально, потому что я меняю тип контента на application / json.когда я использую кнопку оповещения, я получаю [объект, объект], но в angular2 / 4 это не работает ... Я вижу много проблем с той же проблемой, но они не работают для меня.

Это мой файл service.ts

 CatchStockDetail(stock: any)
    : Observable<IStockdetails[]> {
    alert(stock);      

          let stockdetail = JSON.stringify([{ stock }]);
     let headers = new Headers({ 'Content-Type': 'application/json' });
     let options = new RequestOptions({ headers: headers });
    return this._http.post('http://localhost:1234/api/NewStockCount/' + 'Stock', stockdetail,
        { params: [{ stock }] })
        //  .map(res => res.json());
        //     .map(res => res.json().stock)
        .map((response: Response) => <IStockdetails[]>response.json())
        .catch(this.handleError);
}

Это мой файл component.ts

 this._enqService.CatchStockDetail(this.stock)
            .subscribe(value => {
                value.forEach(stock => {
                    this.stockdetail.push(this.stock)
                });
            },
                error => {
                    console.error(error);
                    this.statusMessage = "Problem with the service.Please try again after sometime";
                });

Этомой код API

 [HttpPost]
    public void Stock([FromBody] List<spGetNewStockCountDetails_Result> jsonvalues)

    {
        foreach (spGetNewStockCountDetails_Result Datastock in jsonvalues)
        {
            spGetNewStockCountDetails_Result Stockobject = new spGetNewStockCountDetails_Result();
            Stockobject.schid = Datastock.schid;
            Stockobject.itemid = Datastock.itemid;
            Stockobject.itemcode = Datastock.itemcode;
            Stockobject.itemdescription = Datastock.itemdescription;
            Stockobject.packingtypeid = Datastock.packingtypeid;
            Stockobject.count = Datastock.count;

            enqentities.spGetNewStockCountDetails(Datastock.schid, Datastock.itemid, Datastock.itemcode, Datastock.itemdescription, Datastock.packingtypeid, Datastock.count);
        }

    }

    public class spGetNewStockCountDetails
    {

        public int schid { get; set; }
        // public int id { get; set; }
        public int itemid { get; set; }
        public string itemcode { get; set; }
        public string itemdescription { get; set; }
        public int packingtypeid { get; set; }
        public int count { get; set; }

    }

Это моя ошибка

"{" Message ":" Тип носителя "text / plain" объекта запроса не поддерживается для этого ресурса."," ExceptionMessage ":" Нет MediaTypeFormatter для чтения объекта типа

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Ваш API ожидает массив , но вместо этого вы отправляете строку , поэтому вы получаете код состояния 415

и удаляете параметр, этодаже не требуется в вашем API.

CatchStockDetail(stock: any)
    : Observable<IStockdetails[]> {
    alert(stock);      

     let stockdetail = stock;
     let headers = new Headers({ 'Content-Type': 'application/json' });
     let options = new RequestOptions({ headers: headers });
     return this._http.post('http://localhost:1234/api/NewStockCount/' + 'Stock', stockdetail, options)
        .map((response: Response) => <IStockdetails[]>response.json())
        .catch(this.handleError);
}

Об ошибке, с которой вы столкнулись, посмотрите на API, вы даже не возвращаете данные, поэтому на map вы получаете ошибку,удаление map решит вашу проблему на данный момент.

Вы должны обновить свой компонент

this._enqService.CatchStockDetail(this.stock)
            .subscribe(value => {
if(typeof value !== 'undefined' && value != null){
         value.forEach(stock => {
              this.stockdetail.push(this.stock)
         });
     }
},
error => {
         console.error(error);
         this.statusMessage = "Problem with the service.Please try again after sometime";
});
0 голосов
/ 29 мая 2018

Попробуйте использовать следующий код:

 CatchStockDetail(stock: any): Observable<IStockdetails[]> {
    let body = JSON.stringify([stock]);
    let url = 'http://localhost:1234/api/NewStockCount/' + 'Stock';
    let head: Headers = new Headers();
    head.set('Content-Type', 'application/json');
    head.set('Accept', 'application/json');

    return this._http.post(url, body, head)
      .map((response: Response) => response.json())
      .catch(this.handleError);
  }
0 голосов
/ 29 мая 2018
CatchStockDetail(stock: any): Observable<IStockdetails[]> {   

    let stockdetail = JSON.stringify([{ stock }]);
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers, params: [{ stock }]  });

    return this._http.post('http://localhost:1234/api/NewStockCount/' + 'Stock', stockdetail, options)
    .map((response: Response) => <IStockdetails[]>response.json())
    .catch(this.handleError);
}

Заметил, что вы используете устаревшую версию HTTP, начиная с @angular/http.Вам следует подумать о том, чтобы заменить его на HttpClient вместо @angular/common/http, см. https://angular.io/api/common/http/HttpClient

...