net from form data body asp c# asp.net query-string postdata

from - webrequest c#



La forma más fácil de analizar los datos formateados de "cadena de consulta" (5)

Bastante fácil ... Use el método HttpUtility.ParseQueryString .

Sin probar, pero esto debería funcionar:

var qs = "userID=16555&gameID=60&score=4542.122&time=343114"; var parsed = HttpUtility.ParseQueryString(qs); var userId = parsed["userID"]; // ^^^^^^ Should be "16555". Note this will be a string of course.

Con el siguiente código:

string q = "userID=16555&gameID=60&score=4542.122&time=343114";

¿Cuál sería la forma más fácil de analizar los valores, preferiblemente sin escribir mi propio analizador? Estoy buscando algo con la misma funcionalidad que Request.querystring["gameID"] .


Cómo es esto

using System.Text.RegularExpressions; // query example // "name1=value1&name2=value2&name3=value3" // "?name1=value1&name2=value2&name3=value3" private Dictionary<string, string> ParseQuery(string query) { var dic = new Dictionary<string, string>(); var reg = new Regex("(?:[?&]|^)([^&]+)=([^&]*)"); var matches = reg.Matches(query); foreach (Match match in matches) { dic[match.Groups[1].Value] = Uri.UnescapeDataString(match.Groups[2].Value); } return dic; }


Como se ha mencionado en cada una de las respuestas anteriores, si está en un contexto en el que puede agregar una dependencia a la biblioteca System.Web, tiene sentido usar HttpUtility.ParseQueryString . (Para referencia, la fuente relevante se puede encontrar en la Fuente de referencia de Microsoft ). Sin embargo, si esto no es posible, me gustaría proponer la siguiente modificación a Adil''s respuesta Adil''s que responde a muchas de las inquietudes abordadas en los comentarios (como la sensibilidad a las mayúsculas y las claves duplicadas):

var q = "userID=16555&gameID=60&score=4542.122&time=343114"; var parsed = q.TrimStart(''?'') .Split(new[] { ''&'' }, StringSplitOptions.RemoveEmptyEntries) .Select(k => k.Split(''='')) .Where(k => k.Length == 2) .ToLookup(a => a[0], a => Uri.UnescapeDataString(a[1]) , StringComparer.OrdinalIgnoreCase); var userId = parsed["userID"].FirstOrDefault(); var time = parsed["TIME"].Select(v => (int?)int.Parse(v)).FirstOrDefault();


Puedes hacerlo con linq como este.

string query = "id=3123123&userId=44423&format=json"; Dictionary<string,string> dicQueryString = query.Split(''&'') .ToDictionary(c => c.Split(''='')[0], c => Uri.UnescapeDataString(c.Split(''='')[1])); string userId = dicQueryString["userID"];

Editar

Si puede usar HttpUtility.ParseQueryString, entonces será mucho más sencillo y no será sensible a las mayúsculas y minúsculas como en el caso de LinQ.


Si desea evitar la dependencia de System.Web que se requiere para usar HttpUtility.ParseQueryString , puede usar el método de extensión Uri ParseQueryString encuentra en System.Net.Http .

Tenga en cuenta que debe convertir el cuerpo de la respuesta en un Uri válido para que ParseQueryString funcione.

Tenga en cuenta que también en el documento de MSDN, este método es un método de extensión para la clase Uri, por lo que necesita consultar el ensamblaje System.Net.Http.Formatting (en System.Net.Http.Formatting.dll). Intenté instalarlo en el paquete nuget con el nombre "System.Net.Http.Formatting", y funciona bien.

string body = "value1=randomvalue1&value2=randomValue2"; // "http://localhost/query?" is added to the string "body" in order to create a valid Uri. string urlBody = "http://localhost/query?" + body; NameValueCollection coll = new Uri(urlBody).ParseQueryString();