Как получить различные типы responseType в angular из основного метода веб-API asp.net

для этой операции мы написали один веб-API в asp.net core 2.0 и возвращаем два разных типа ответа, если условие выполнено успешно, он вернет zip-файл в качестве ответа на angular, и мы сохраним его в Machine.

и если условие ложно, оно отправит JSON в angular, поэтому здесь мы хотим показать всплывающее окно пользователю вместе с данными JSON.

но мы сохраняем [responseType: "arraybuffer"] в приложении angular, поэтому для обоих условий мы получаем в ответ "arraybuffer"

//asp.net core web api code
// code wrote for two different return type 

if (condition == true )
{
  return File(zipBytes, "application/zip", "Data.zip");
}
else
{
  return Json(new Response { Code=111,Data= 
                            JsonConvert.SerializeObject(myList)});
}

//*************************************************** ********************//

//Angular 6 Code
//Code wrote for getting a response as a zip in the angular service file 

postWithZip(path: string, body: Object = {}): Observable<ArrayBuffer> {
    return this.http
      .post(`${path}`, JSON.stringify(body), {
        headers: this.setHeaders({ multipartFormData: false, zipOption: true }),
        responseType: "arraybuffer"
      })
      .catch(this.formatErrors);
  }

как вы можете видеть в приведенном выше угловом коде, он обрабатывает ответ zip-файла, но не работает для ответа JSON.

Итак, как мы можем достичь обоих сценариев в этом случае?

//*************************************************** *************//

// this is the Method we wrote in asp.net 
[Route("GetAcccountWithCredits")]
        [HttpPost]
        public IActionResult GetAccountWithCredtis([FromBody]AccountsWithCreditsRequest tempRequest)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

                BusinessHelper businessHelper = new BusinessHelper(_hostingEnvironment, _iconfiguration, _smtpDetails, _options, _dbSettings);
                //Get data from stored procedure
                var accountsWithCredits = businessHelper.getAccountsWithCredtis(tempRequest);

                //Delete existing files from Excel folder
                string[] filePaths = Directory.GetFiles(_hostingEnvironment.ContentRootPath + "\\Excels\\Accounts with Credit Balances");
                foreach (string filePath in filePaths)
                {
                    System.IO.File.Delete(filePath);
                }

                DataTable dt = new DataTable();
                //Convert stored procedure response to excel
                dt = businessHelper.ConvertToCSV("Garages", accountsWithCredits, _hostingEnvironment.ContentRootPath + "\\" + _iconfiguration["CSVFilePath"]);
                List<string> myList = new List<string>();
                if (dt.TableName == "codeDoesNotExits")
                {
                    foreach (DataRow row in dt.Rows)
                    {
                        myList.Add((string)row[0]);
                    }
                }
                if (myList.Count == 0)
                {
                    //Create List of excel files details(name, path)
                    List<FileObjectDeails> listOfFiles = new List<FileObjectDeails>();
                    FileObjectDeails garadesList = new FileObjectDeails();
                    garadesList.FileName = _iconfiguration["GaragesFileName"];
                    garadesList.FilePath = _hostingEnvironment.ContentRootPath + "\\" + _iconfiguration["CSVFilePath"] + "\\" + _iconfiguration["GaragesFileName"];
                    listOfFiles.Add(garadesList);


                    if (tempRequest.EmailId != "")
                    {
                        string subject = _iconfiguration["AccountsWithCreditEmailSubject"];
                        string body = _iconfiguration["AccountsWithCreditEmailBody"];
                        //Send Email with files as attachment
                        businessHelper.SendEmail(listOfFiles, tempRequest.EmailId, subject, body);
                    }

                    //Convert files into zip format and return
                    byte[] zipBytes;
                    using (var ms = new MemoryStream())
                    {
                        using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
                        {
                            foreach (var attachment in listOfFiles)
                            {
                                var entry = zipArchive.CreateEntry(attachment.FileName);

                                using (var fileStream = new FileStream(attachment.FilePath, FileMode.Open))
                                using (var entryStream = entry.Open())
                                {
                                    fileStream.CopyTo(entryStream);
                                }
                            }
                        }
                        ms.Position = 0;
                        zipBytes = ms.ToArray();
                    }
                    return File(zipBytes, "application/zip", "GarageData.zip");
                }
                else
                {
                    return Json(new Response { Code = 111, Status = "Got Json", Message = "Fount Account Code which is not present in XML File", Data = JsonConvert.SerializeObject(myList) });
                }
            }
            catch (Exception e)
            {
                return BadRequest(e.Message.ToString());
            }
        }

в коде .net, какой тип возвращает ваш метод? (можете показать полный код метода)

Mohamed Ali RACHID 09.04.2019 15:53

возвращаемый тип метода - "IActionResult"

Aniket Phate 10.04.2019 09:15

эй, @MohamedAliRACHID, я только что добавил метод .net, пожалуйста, проверьте его

Aniket Phate 10.04.2019 10:59

Метод с двумя разными типами возврата имеет недопустимую спецификацию. Типы возвращаемых значений метода должны быть инвариантными. То, что вы могу что-то делаете, не означает, что это разумно.

theMayer 12.04.2019 13:50
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
4
892
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

для принятия обоих типов ответов нам нужно внести изменения в код службы angular, как показано ниже.

 postWithZip(
    path: string,
    body: Object = {}
  ): Observable<HttpResponse<ArrayBuffer>> {
    return this.http
      .post(`${path}`, JSON.stringify(body), {
        headers: this.setHeaders({ multipartFormData: false, zipOption: true }),
        observe: "response",
        responseType: "arraybuffer"
      })
      .catch(this.formatErrors);
  }

и затем мы можем идентифицировать оба ответа, используя contentType, как показано ниже.

   res => {
        if (res.headers.get("content-type") == "application/zip") {
          *//Write operation you want to do with the zip file*
        } else {
          var decodedString = String.fromCharCode.apply(
            null,
            new Uint8Array(res.body)
          );
          var obj = JSON.parse(decodedString);
         *//Write operation you want to done with JSON*
        }
      }

Другие вопросы по теме