Как я могу получить доступ к параметрам из запроса POST (или другого HTTP) на сервере C #? - PullRequest
0 голосов
/ 14 мая 2019

Я создаю приложение Reactjs с использованием ASP.Net Core, и я совершенно новичок в этом. У меня есть компонент JS, который (насколько мне известно) выполняет соответствующий запрос на выборку (POST) для контроллера сервера C #. Сервер окончательно получает запрос. Однако я абсолютно не знаю, как получить доступ к параметрам запроса (который я передаю через тело).

Я пытался использовать [FromBody] для прямого доступа к телу. Я также пытался использовать Request.Body, Request.Form, Request.Query, Request.Params и т. Д. Я пытался следовать рекомендациям, которые я нашел в Интернете, которые, кажется, пытаются решить мою проблему , Некоторые из них не сработали. Большинство из них используют ключевые слова, классы и т. Д., Которые мне не доступны в моих текущих библиотеках, и они не перечисляют соответствующие библиотеки. Насколько я знаю, я уже наткнулся на правильный ответ. Но для кого-то вроде меня с очень логичным умом, но и с почти нулевым опытом работы в этой области, я не могу сосредоточиться на этом.

Мой POST-запрос с использованием fetch в JavaScript:

fetch('api/Database/PushStatus',
    {
        method: 'post',
        headers: { 'Content-type': 'application/json' },
        body: JSON.stringify({ order: this.state.orderNum, status: this.state.newStatus })
    }
).then(response => {
    response.json().then(data => {
        this.setState({ reqCheck: "" + response, didPush: false });
    })
}).catch(err => {
    this.setState({ reqCheck: "Failure! (js)", didPush: false })
});

И обработка моего запроса на моем сервере C #:

[Route("api/[controller]/[action]")]
public class DatabaseController : Controller
{
    string conStri = "Data Source=ADM293\\MSSQLSERVER01;Initial Catalog=testDB;User ID=sa;Password=password.1";
    SqlConnection cnct = null;

    [HttpPost]
    public void PushStatus(string order, string status)
    {
        cnct = new SqlConnection(conStri);
        SqlCommand command = new SqlCommand("insert into testTable values ('" + order + "', '" + status + "');", cnct);

        using (cnct)
        {
            cnct.Open();
            int result = command.ExecuteNonQuery();
            cnct.Close();
        }
    }
}

Я бы хотел, чтобы мой сервер обновлялся содержимым this.state.orderNum и this.state.newStatus. Вместо этого мой сервер обновляется пустыми строковыми значениями (что имеет смысл).

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Вы можете создать класс, который представляет запрос:

public class PushStatusRequest
{
    public string Order { get; set; }
    public string Status { get; set; }
}

И используйте это так:

[HttpPost]        
public void PushStatus([FromBody] PushStatusRequest request){
   //request.Status
   //request.Order
}
0 голосов
/ 14 мая 2019

По умолчанию заглавные буквы изменяются между JavaScript и C #.Итак, вам, вероятно, просто нужно изменить сигнатуру вашего метода:

public void PushStatus(string Order, string Status)

Тем не менее, наличие класса, как предложено @Anteo, обычно лучше.Кроме того, я полагаю, вы поставили SqlConnection только для ясности.Вы не должны делать это в контроллере

0 голосов
/ 14 мая 2019

@ Антео прав.Но я хотел бы добавить некоторые объяснения.Вы столкнулись с двумя различными способами передачи параметров в контроллер.Вы пытаетесь использовать тело (устанавливая тело в запросе) в качестве входа, а запрос (в контроллере) - в качестве вывода.

Ну, тело - это один тип, и он должен бытьнекоторая модель на стороне контроллера.Используйте [FromBody] для автоматического получения ваших данных из запроса в модель.Создайте эту модель как отдельный класс, следуя той же политике именования (игнорируя регистр).

Тогда строка запроса - это то, что вы используете на стороне контроллера.На стороне запроса, он следует URL следующим образом: https://host:port/route/to/then/query/params.Так что, если я не ошибаюсь, базовый URL является частью https://host:port.Все, что осталось, это строка запроса .Часть этого привязана к маршруту к действию вашего контроллера.Все, что осталось, интерпретируется как полезная информация и сопоставляется с параметрами действия.

Итак, вот вам и нужно выбрать (в зависимости от длины ваших orderNum и newStatus), какой подход использовать.Я бы рекомендовал использовать тело, так как это больше данных, чем маршрутизация.

Кроме того, если вы наследуете [ControllerBase][1], то вы можете использовать свойство Request в действии для доступа к самому запросу.Но будьте осторожны.

PS Я бы порекомендовал вам прочитать больше о запросах, таких как данные формы, тело, запросы и т. Д.

Если у вас есть какие-либо дополнительные вопросы, не стесняйтесь задавать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...