je fais une demande de faire une méthode post Webapi asp.net, et je ne peux pas obtenir une variable de demande.
Demande
jQuery.ajax({ url: sURL, type: 'POST', data: {var1:"mytext"}, async: false, dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=UTF-8' })
.done(function (data) {
...
});
API Web Fnx
[AcceptVerbs("POST")]
[ActionName("myActionName")]
public void DoSomeStuff([FromBody]dynamic value)
{
//first way
var x = value.var1;
//Second way
var y = Request("var1");
}
je ne peux pas obtenir le contenu var1 dans les deux sens ... (sauf si je crée une classe pour cela)
comment dois-je faire ça?
Première manière:
public void Post([FromBody]dynamic value)
{
var x = value.var1.Value; // JToken
}
Notez que value.Property
renvoie en fait une instance JToken
. Pour obtenir sa valeur, vous devez appeler value.Property.Value
.
Deuxième manière:
public async Task Post()
{
dynamic obj = await Request.Content.ReadAsAsync<JObject>();
var y = obj.var1;
}
Les deux opérations ci-dessus utilisent Fiddler. Si la première option ne fonctionne pas pour vous, essayez de définir le type de contenu sur application/json
pour vous assurer que la variable JsonMediaTypeFormatter
est utilisée pour désérialiser le contenu.
Après avoir tapé dans ma tête pendant un moment et essayé de nombreuses choses, j'ai fini par mettre des points d'arrêt sur le serveur d'API et de trouver les paires clé-valeur coincées dans la requête. Après avoir su où ils se trouvaient, il était facile d'y accéder. Cependant, j'ai seulement constaté que cette méthode fonctionnait avec WebClient.UploadString. Cependant, cela fonctionne assez facilement et vous permet de charger autant de paramètres que vous le souhaitez et d'y accéder très facilement côté serveur. Notez que je cible .net 4.5.
CÔTÉ CLIENT
// Client request to POST the parameters and capture the response
public string webClientPostQuery(string user, string pass, string controller)
{
string response = "";
string parameters = "u=" + user + "&p=" + pass; // Add all parameters here.
// POST parameters could also easily be passed as a string through the method.
Uri uri = new Uri("http://localhost:50000/api/" + controller);
// This was written to work for many authorized controllers.
using (WebClient wc = new WebClient())
{
try
{
wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
response = wc.UploadString(uri, login);
}
catch (WebException myexp)
{
// Do something with this exception.
// I wrote a specific error handler that runs on the response elsewhere so,
// I just swallow it, not best practice, but I didn't think of a better way
}
}
return response;
}
DU CÔTÉ SERVEUR
// In the Controller method which handles the POST request, call this helper:
string someKeyValue = getFormKeyValue("someKey");
// This value can now be used anywhere in the Controller.
// Do note that it could be blank or whitespace.
// This method just gets the first value that matches the key.
// Most key's you are sending only have one value. This checks that assumption.
// More logic could be added to deal with multiple values easily enough.
public string getFormKeyValue(string key)
{
string[] values;
string value = "";
try
{
values = HttpContext.Current.Request.Form.GetValues(key);
if (values.Length >= 1)
value = values[0];
}
catch (Exception exp) { /* do something with this */ }
return value;
}
Pour plus d'informations sur la gestion des paires Request.Form clé/valeur à valeurs multiples, voir:
http://msdn.Microsoft.com/en-us/library/6c3yckfw(v=vs.110).aspx
J'ai cherché toute la matinée à trouver une réponse décrivant à la fois le code client et le code serveur, puis j'ai finalement trouvé la réponse.
Brève introduction - L’UI est un projet MVC 4.5 qui implémente une vue standard. Le côté serveur est un MVC 4.5 WebApi. L'objectif était de POST modéliser le modèle en tant que JSON, puis de mettre à jour une base de données. C'était ma responsabilité de coder à la fois l'interface utilisateur et le backend. Ci-dessous le code. Cela a fonctionné pour moi.
Modèle
public class Team
{
public int Ident { get; set; }
public string Tricode { get; set; }
public string TeamName { get; set; }
public string DisplayName { get; set; }
public string Division { get; set; }
public string LogoPath { get; set; }
}
Côté client (contrôleur d'interface utilisateur)
private string UpdateTeam(Team team)
{
dynamic json = JsonConvert.SerializeObject(team);
string uri = @"http://localhost/MyWebApi/api/PlayerChart/PostUpdateTeam";
try
{
WebRequest request = WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
WebResponse response = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
}
catch (Exception e)
{
msg = e.Message;
}
}
Côté serveur (contrôleur WebApi)
[Route("api/PlayerChart/PostUpdateTeam")]
[HttpPost]
public string PostUpdateTeam(HttpRequestMessage context)
{
var contentResult = context.Content.ReadAsStringAsync();
string result = contentResult.Result;
Team team = JsonConvert.DeserializeObject<Team>(result);
//(proceed and update database)
}
WebApiConfig (route)
config.Routes.MapHttpRoute(
name: "PostUpdateTeam",
routeTemplate: "api/PlayerChart/PostUpdateTeam/{context}",
defaults: new { context = RouteParameter.Optional }
);
Essaye ça.
public string Post(FormDataCollection form) {
string par1 = form.Get("par1");
// ...
}