Je souhaite recevoir les données du formulaire de Postman:
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
1) Si vous devez envoyer Content-Type: multipart/form-data
OR simplement form-data
Ceci est le premier tab
de Postman
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
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
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
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
L'avantage de cette option, vous pouvez envoyer complex type
en tant que données publiées et similaires
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
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--
La déclaration ci-dessous peut le faire:
NameValueCollection form = HttpContext.Current.Request.Form;