web-dev-qa-db-fra.com

Comment obtenir des données de formulaire de Postman To Web Api

Je souhaite recevoir les données du formulaire de Postman:

enter image description here

Content-Type: application/json

Voici la méthode WebApi:

[HttpPost]
[Route("api/test")]
public async Task TestMethod(HttpRequestMessage request)
{
    var test = await request.Content.ReadAsStringAsync();
}

Ce que je reçois, c'est:

------WebKitFormBoundarypqDvmeG89cBR9mK9
Content-Disposition: form-data; name="test"

esad
------WebKitFormBoundarypqDvmeG89cBR9mK9--

Mais je ne veux pas de données avec WebKitFormBoundary et j'ai la restriction d'utiliser uniquement les données de formulaire. Est-ce qu'il y a un autre moyen?

Informations d'appel HTTP:

POST /api/test HTTP/1.1
Host: localhost:16854
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 1a3d6427-4956-707d-da0c-3a29a63c7563

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="test"

esad
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Informations sur l'appel de boucle:

curl -X POST \
  http://localhost:16854/api/test \
  -H 'cache-control: no-cache' \
  -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -H 'postman-token: 02055873-e9a8-e9a6-019c-b407992b0e2f' \
  -F test=esad 
4
Hina Khuman

1) Si vous devez envoyer Content-Type: multipart/form-data OR simplement form-data

Ceci est le premier tab de Postman

enter image description here

Si vous devez collecter une seule paire clé/valeur de votre form-data

[HttpPost]
[Route("api/test")]
public HttpResponseMessage TestMethod(HttpRequestMessage request)
{
    var testValue = HttpContext.Current.Request.Form["test"];

    return Request.CreateResponse(HttpStatusCode.OK, testValue);
}

Si vous devez collecter plusieurs paires clé/valeur de votre form-data

[HttpPost]
[Route("api/test")]
public HttpResponseMessage TestMethod(HttpRequestMessage request)
{
    NameValueCollection collection = HttpContext.Current.Request.Form;

    var items = collection.AllKeys.SelectMany(collection.GetValues, (k, v) => new { key = k, value = v });

    //We just collect your multiple form data key/value pair in this dictinary
    //The following code will be replaced by yours
    Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();

    foreach (var item in items)
    {
        keyValuePairs.Add(item.key, item.value);
    }

    return Request.CreateResponse(HttpStatusCode.OK, keyValuePairs);
}

2) Si vous devez envoyer Content-Type: application/x-www-form-urlencoded

Ceci est le deuxième tab de Postman

enter image description here

Ensuite, votre API sera

[HttpPost]
[Route("api/test")]
public async Task TestMethod(HttpRequestMessage request)
{
    var test = await request.Content.ReadAsFormDataAsync();
}

Ensuite, vous obtiendrez la sortie suivante lorsque vous déboguez votre code avec un point d'arrêt

enter image description here


3) Si vous devez envoyer Content-Type: application/json

Ceci est le troisième tab de Postman

Voir la capture d'écran ci-dessous pour une telle option

enter image description here

Et ton api est

[HttpPost]
[Route("api/test")]
public async Task TestMethod(HttpRequestMessage request)
{
     var jObject = await request.Content.ReadAsAsync<JObject>();

     Item item = JsonConvert.DeserializeObject<Item>(jObject.ToString());
}

Et votre modèle pour collecter ces données publiées

public class Item
{
    public string test { get; set; }
}

Et votre sortie sera

enter image description here

L'avantage de cette option, vous pouvez envoyer complex type en tant que données publiées et similaires

enter image description here

Et ton api est

[HttpPost]
[Route("test")]
public async Task TestMethod(HttpRequestMessage request)
{
    var jObject = await request.Content.ReadAsAsync<JObject>();

    Sample sample = JsonConvert.DeserializeObject<Sample>(jObject.ToString());
}

Et vous modélisez pour collecter ces données sont

public class Item
{
    public string test { get; set; }
}

public class Sample
{
    public Item item { get; set; }
}

Et vous verrez que la sortie est

enter image description here

14
er-sho

Le code suivant lira correctement la clé/valeur lors de son envoi par Postman avec form-data option sélectionnée

[HttpPost]
[Route("api/test")]
public async Task<HttpResponseMessage> TestMethod(HttpRequestMessage request)
{
    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    await Request.Content.ReadAsMultipartAsync(provider);

    var testValue = provider.FormData.GetValues("test")[0];

    return Request.CreateResponse(HttpStatusCode.OK);
}

Un exemple plus détaillé peut être trouvé ici (Section: Lecture des données de contrôle de formulaire ).

Modifier: l'appel HTTP envoyé au gestionnaire d'API ci-dessus est celui ci-dessous:

POST /api/stats/testmethod HTTP/1.1
Host: localhost:4100
Cache-Control: no-cache
Postman-Token: 999fd13d-f804-4a63-b4df-989b660bcbc5
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="test"

esad
------WebKitFormBoundary7MA4YWxkTrZu0gW--
1
Tasos K.

La déclaration ci-dessous peut le faire:

NameValueCollection form = HttpContext.Current.Request.Form;
0
Piyush