Несколько вызовов AddParameter добавляют только первый параметр, игнорируя остальные - PullRequest
2 голосов
/ 10 января 2020

Соответствующая информация о проекте:

  • Метод драйвера - это проект XUnit в. Net Core 3.1,
  • API - это проект API / MVC в. Net Core 3.1.
  • Оба находятся в одном решении,
  • Я запускаю два экземпляра VS 2019 для тестирования и отладки в данный конкретный момент.
  • Дизайн тестов настроен на проведение полного теста функциональности из-за необходимости диагностики в не зависящих от меня обстоятельствах, и другие разработчики в команде согласны с этим подходом, учитывая эти обстоятельства.

Я просмотрел документацию по рекомендуемому использованию в https://github.com/restsharp/RestSharp/wiki/Recommended-Usage, где они добавляют несколько параметров, и мой код функционально идентичен. Проблема в том, что только первый добавленный параметр является тем, который проходит через конечную точку API ... То есть, только первый добавленный параметр проходит через провод для объекта Request.Form:

//driver method:
url = "MyURLHere";
parameters.Add(new KeyValuePair<string, string>("folderName", FolderName)); //is added
parameters.Add(new KeyValuePair<string, string>("configurationName", ConfigurationName)); //is not added
response = CallBox(url, Method.POST, parameters.ToArray(), true);

//...some time later...

private IRestResponse CallBox(string url, Method method, KeyValuePair<string, string>[] parameters = null, bool isUpload = false) {
    parameters = parameters ?? new KeyValuePair<string, string>[] { }; 

    RestClient client = new RestClient(url);
    RestRequest request = new RestRequest(method);
    foreach (KeyValuePair<string, string> param in parameters) {
        request.AddParameter(param.Key, param.Value, ParameterType.RequestBody);
    }
    request.AddHeader("content-type", "multipart/form-data; boundary=-----------------------------28947758029299");
    IRestResponse response = client.Execute(request);
    return response;
}

Важная информация о коде API:

public class BoxController : ControllerBase {
...
[HttpPost("MyURL")]
[ProducesResponseType(typeof(ActionResult), 201)]
[ProducesResponseType(typeof(ActionResult), 400)]
[ProducesResponseType(typeof(ActionResult), 500)]
public async Task<IActionResult> MyAPIEndPoint() {
...
//Checking Request.Form["ObjectKeysHere"]

Что здесь происходит и как я могу решить эту проблему? (Спасибо)

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Что здесь происходит ...

ParameterType.RequestBody может быть добавлено только один раз, так как запрос имеет только один ТЕЛО. Все последующие добавления будут игнорироваться.

Ссылка Документация

Тело запроса

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

примечание: выделено мое.

Это подтверждает проблему как продемонстрировано в представленном исходном примере.

... и как мне решить эту проблему?

В этом случае используйте ParameterType.GetOrPost

private IRestResponse CallBox(string url, Method method, KeyValuePair<string, string>[] parameters = null, bool isUpload = false) {
    parameters = parameters ?? new KeyValuePair<string, string>[] { }; 

    RestClient client = new RestClient(url);
    RestRequest request = new RestRequest(method);
    foreach (KeyValuePair<string, string> parameter in parameters) {
        request.AddParameter(parameter.Key, parameter.Value, ParameterType.GetOrPost);
    }        
    IRestResponse response = client.Execute(request);
    return response;
}

Ссылка Документация

Получение или публикация

Это зависит от метода в зависимости от способа. Если вы выполняете вызов GET, RestSharp добавит параметры к URL в форме url?name1=value1&name2=value2.

При запросах POST или PUT, это зависит от того, есть ли у вас файлы, прикрепленные к запросу. Если нет, то параметры будут отправлены как тело запроса в форме name1=value1&name2=value2. Кроме того, запрос будет отправлен как application/x-www-form-urlencoded.

. В обоих случаях имя и значение будут автоматически кодироваться по URL.

Если у вас есть файлы, RestSharp отправит multipart/form-data запрос. Ваши параметры будут частью этого запроса в виде:

Content-Disposition: form-data; name="parameterName"

ParameterValue

Примечание: выделение шахты.

0 голосов
/ 12 января 2020

Я думаю, вы должны изменить свой код:

foreach (KeyValuePair<string, string> param in parameters)
{
  Require.Argument(param.Key, param.Value);
  request.AddParameter(new Parameter(param.Key, param.Value, ParameterType.RequestBody));
}
...