Как мне PostAsync () с несколькими простыми типами? - PullRequest
0 голосов
/ 12 мая 2018

Как мне использовать PostAsync () с несколькими простыми типами в качестве параметров, у меня ниже приведен контроллер действий:

[HttpPost]
[Route("users/verifyLoginCredentials/{username}/{password}")]
public IHttpActionResult VerifyLoginCredentials([FromUri]string username, string password)
{

   //Do Stuff......
   return Ok("Login Successful");

}

Я пытаюсь вызвать его из клиентского приложения .Net Framerwork 4.5, как показано ниже:

static async Task<Uri> CreateProductAsync(string username, string password)
{


     HttpClient client = new HttpClient();
     client.BaseAddress = new Uri(uri);
     client.DefaultRequestHeaders.Accept.Clear();
     client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
     client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

     var value = new Dictionary<string, string>
     {
        { "username", "test123" }
     };

     var content = new FormUrlEncodedContent(value);
     var result = await client.PostAsync("users/verifyLoginCredentials/{username}/{password}", content);
     string resultContent = await result.Content.ReadAsStringAsync();

     result.EnsureSuccessStatusCode();

     // return URI of the created resource.
     return result.Headers.Location;
}

До сих пор я пробовал несколько способов и много читал, в последнее время здесь .

Я понимаю, что со сложными типами легче иметь делочем для работы с простыми типами, и что по умолчанию сложные типы кодируются в теле / ​​содержимом запроса, в то время как простые типы кодируются в URI.

Я попытался опубликовать данные, отправив закодированные пары ключ / значениеиспользуя FormUrlEncodedContent(string), отправив Json через StringContent(), я пробовал использовать как одиночные, так и множественные параметры, но я понимаю, что сейчас это ограничение касается только сложных типов.

Я прочитал много публикаций и руководств по MSDN, может быть, яя пропускаю важную информацию.

Действие контроллера, приведенное выше, действительно выполняется, но оба параметра имеют строковое значение"{имя пользователя}" и "{пароль}"

Ответы [ 2 ]

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

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

Примером может быть:

public class LoginModel 
{
    [Required]
    public string Username { get;set }

    [Required]
    public string Password { get;set }
}

Теперь вы можете сделать:

[HttpPost]
[Route("users/verifyLoginCredentials")]
public IHttpActionResult VerifyLoginCredentials([FromBody]LoginModel model)
{
   //validate your model    
   if ( model == null || !ModelState.IsValid )     
   {
       return BadRequest();
   }

   //stuff
   return Ok();
}

Чтобы использовать его, вы должны сделать что-то вроде этого:

var model = new LoginModel { Username = "abc", Password="abc" } ;

using (var client = new HttpClient())
{               
    var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");               

    var result = await client.PostAsync("your url", content);
    return await result.Content.ReadAsStringAsync();
}

Не отправлять пароли в URI, поскольку любой может перехватить запрос и посмотреть, что это за пароль.

Любые данные, которыенеобходимо сохранить в тайне, вы отправляете его в теле запроса и убедитесь, что запрос превышает https, так как он кодирует заголовки и тело сообщения, чтобы никто не мог просмотреть данные.

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

Когда вы пишете

[Route("users/verifyLoginCredentials/{username}/{password}")]

Вы говорите «сопоставьте параметры имени пользователя и пароля в указанном порядке из Uri», поэтому все, что вы отправляете через тело POST, будет игнорироваться.

Вы явно передаете {username} и {password} в качестве параметров:

var result = await client.PostAsync("users/verifyLoginCredentials/{username}/{password}", content);

Вы должны сделать это вместо этого:

var message = new HttpRequestMessage(HttpMethod.Post, "users/verifyLoginCredentials/username/test123");
var result = await client.SendAsync(message);
string resultContent = await result.Content.ReadAsStringAsync();

Если вы хотите опубликоватьданные как тело вместо части URL, используйте это:

[Route("users/VerifyLoginCredentials")]
public IHttpActionResult VerifyLoginCredentials(string username, string password)

 var value = new Dictionary<string, string>
 {
    { "username", "yourUsername" },
    { "passwird", "test123" }
 };

 var content = new FormUrlEncodedContent(value);
 var result = await client.PostAsync("users/verifyLoginCredentials/", content);
 string resultContent = await result.Content.ReadAsStringAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...