Передайте длинный список идентификаторов в Web API, не помещая их в URL - PullRequest
0 голосов
/ 05 ноября 2019

Я бы хотел иметь возможность передавать длинную строку (список идентификаторов) из нашего Angular внешнего интерфейса в наш .NET Web API. Однако иногда эта строка превышает ограничение на количество символов в URL, поэтому я не хочу передавать ее через URL.

Какой хороший способ сделать это?

Front end: Сначала я подумал отправить строку через PUT's HTTP Body в httpOptions, но потом понял, что с запросом PUT мне может даже не понадобиться HTTP Body - думаю, я могу просто передать данныепрямо в PUT's data параметр.

PUT-запрос

public put(apiPath, data): Observable<any>
{
    var url = this.globals.getBaseUrl() + apiPath + "/" + data["ID"];

    const httpOptions =
    {
        headers: new HttpHeaders({"Content-Type": "application/json"})
        ,withCredentials: true
    };

    return this.httpClient.put<any>(url, data, httpOptions)
        .pipe(catchError(this.handleError));
}  

.

.NET Web API: Затем, в API, как я могу разобраться в этом data, которое я отправил с помощью запроса PUT? Мой игровой план состоял в том, чтобы сделать модель для этого контроллера, которая имеет только одно поле - строку идентификаторов. Затем в контроллере я бы взял его, проанализировал, разделил и передал в нашу базу данных. Просто не знаете, как получить это data в контроллере.

Контроллер:

// PUT: api/myApiPath/5
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> Put_myTable(int id, _myTable _myTable)
{
    db.Entry(_myTable).State = EntityState.Modified;
        try
        {
            // ----- put -----
            await db.SaveChangesAsync();
            // ----- /put -----
        }
        else
        {
            error = "Unauthorized.";
            throw new HttpResponseException(HttpStatusCode.Forbidden);
        }

}

1 Ответ

1 голос
/ 06 ноября 2019

Я использую ядро ​​.net, но я думаю, что вам просто нужен атрибут [FromBody] в параметре вашего бэкэнда, как показано ниже. Какой бы объект вы ни передавали из внешнего интерфейса, он должен соответствовать типу объекта, который ожидает ваш внутренний интерфейс. Так что если бы у вас был простой массив чисел на веб-интерфейсе, ваш бэкэнд выглядел бы так:

[HttpPut]
public async Task<IHttpActionResult> Put_myTable([FromBody] List<int> ids)
{
}
...