web-dev-qa-db-fra.com

L'API Web ASP.NET ne peut pas obtenir le protocole HTTP application/x-www-form-urlencoded POST

Je suis nouveau sur Web-api. Je souhaite recevoir des données HTTP POST à l'aide de Web-api. Le type de contenu est application/x-www-form-urlencoded et le corps de la requête est le suivant:

data={"mac":"0004ED123456","model":"SG6200NXL"} (format JSON). 

Mon contrôleur est comme ça:

public void Post([FromBody]string formData)
{
    data.Add(formData);
}

Mais formData est toujours nul. Seulement lorsque je change le corps de la demande en:

={"mac":"0004ED123456","model":"SG6200NXL"}

Je peux trouver que {"mac":"0004ED123456","model":"SG6200NXL"} a été enregistré dans ma chaîne formData.

Ma question est donc la suivante: comment dois-je recevoir les données avec le format: 

data={"mac":"0004ED123456","model":"SG6200NXL"}

Et existe-t-il un moyen simple de dessaler le JSON en C #?

Merci pour l'aide!

UPDATE: J'ai essayé d'utiliser le modèle, mais cela ne fonctionne toujours pas pour moi . Mon modèle est:

public class Device
    {
        public string mac { get; set; }
        public string model { get; set; }
    }

et ma demande HTTP POST est:

entête:

User-Agent: Fiddler
Content-type: application/x-www-form-urlencoded
Host: localhost:52154
Content-Length: 46

corps:

data={"mac":"0004ED123456","model":"SG6200NX"}

Je dois utiliser Content-type: application/x-www-form-urlencoded autant que je sache car le HTTP POST est envoyé par un routeur. Mon travail consiste à recevoir les données.

22
Jun

Citant de ici :

Par défaut, l’API Web essaie d’obtenir des types simples à partir de l’URI de la demande. L'attribut FromBody indique à Web API de lire la valeur à partir du corps de la demande.

L'API Web lit le corps de la réponse au plus une fois. Un seul paramètre d'action peut donc provenir du corps de la demande. Si vous devez extraire plusieurs valeurs du corps de la demande, définissez un type complexe.

Deuxièmement, le client doit envoyer la valeur au format suivant:

= valeur

Plus précisément, la partie nom de la paire nom/valeur doit être vide pour un type simple.

Ainsi, si vous souhaitez publier des données au format data=string, vous devez créer un type complexe.

public class MyFormData
{
    public string Data { get; set; }
}

Et mettez à jour votre contrôleur comme suit:

public void Post(MyFormData formData)
{
    //your JSON string will be in formData.Data
}

Bien entendu, vous pouvez également remplacer le type de contenu par JSON, mais cela dépend vraiment de vos besoins.

28
YK1

Cet article est vieux, mais je suis tombé dessus en cherchant une réponse. Je posterai comment j'ai réussi à faire fonctionner le mien, peut-être que quelqu'un le trouvera utile. 

Voici la demande: 

POST /api/values HTTP/1.1
Host: localhost:62798
Accept: text/json
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: 51ee1c5f-acbb-335b-35d9-d2b8e62abc74

UID=200&EMAIL=john%40jones.com&FIRST_NAME=John&LAST_NAME=jones&PHONE=433-394-3324&CITY=Seattle&STATE_CODE=WA&Zip=98105

Voici le modèle: 

public class SampleModel{
    public string UID { get; set; }

    public string Email { get; set; }

    public string First_Name { get; set; }

    public string Last_Name { get; set; }

    public string Phone { get; set; }

    public string City { get; set; }

    public string State_Code { get; set; }

    public string Zip { get; set; }
}

Et voici la méthode POST qui convertit automagiquement (FromBody) les valeurs codées en url dans le modèle. 

public HttpResponseMessage Post([FromBody] SampleModel value){

J'ai pu choisir n'importe quelle valeur, c'est-à-dire 

    SearchCity(value.City);
    SearchName(value.Last_Name);
6
bold

Vous devriez créer un objet de vos données comme:

public class Device
{
  public string mac {get;set;}
  public string model {get;set;}
}

puis changez la méthode d'action de votre contrôleur comme ceci et passez votre objet à cette méthode de consume

public void Post(Device deviceData)
{
    // You can extract data like deviceData.mac, deviceData.model etc
    data.Add(deviceData);
}

Vous pouvez utiliser l’une des bibliothèques populaires json.net pour sérialiser/désérialiser un objet json en C #

3
SoftSan

créer un modèle

public class MyClass {
    public string mac { get; set; }
    public string model { get; set; }
}

et utilisez .net JavaScriptSerializer (). Deserialize

public void Post([FromBody]string formData){
    MyClass obj = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<MyClass>(formData);
    //get mac and model by obj.mac obj.model
}

à votre santé :)

2
HenryChuang

Si vous utilisez le type de contenu: application/x-www-form-urlencoded, vous ne pouvez pas vous attendre à recevoir du JSON.

Je suppose que vous utilisez un formulaire pour envoyer les données au contrôleur Web Api?

Tout d'abord, vous devez modifier le type Content-type en application/json, puis vous devez vous assurer que vous envoyez des données JSON dans le corps de votre demande. Si vous envoyez les données via un formulaire, vous pouvez utiliser javascript pour créer un objet JSON à partir de vos données de formulaire.

Pour désérialiser JSON en C #, je recommande Json.NET: http://json.codeplex.com/

0
Håkan Fahlstedt