C#学习教程:可移植类库(PCL)版本的HttpUtility.ParseQueryString共享)版本或一些我可以使用的代码?我想读取一个非常复杂的URL。HttpUtility.ParseQueryString返回继承自NameValueCollectionHttpValueCollection(内部类)。NameValueCollection是一个键值对的集合,像一个字典,但它支持重复,保持顺序,并且只实现了IEnumerable(这个集合是前泛型的)。PCL不支持NameValueCollection。我的解决方案(从.NET框架中部分提升和修改)是用Collection替换HttpValueCollection,其中HttpValue只是一个键值对。publicsealedclassHttpUtility{publicstaticHttpValueCollectionParseQueryString(stringquery){if(query==null){thrownewArgumentNullException("query");}if((query.Length>0)&&(query[0]=='?')){query=query.Substring(1);}返回新的HttpValueCollection(查询,真);}}publicsealedclassHttpValue{publicHttpValue(){}publicHttpValue(stringkey,stringvalue){this.Key=key;这个。价值=价值;}publicstringKey{get;放;}公共字符串值{得到;放;}}publicclassHttpValueCollection:Collection{#regionConstructorspublicHttpValueCollection(){}publicHttpValueCollection(stringquery):this(query,true){}publicHttpValueCollection(stringquery,boolurlencoded){if(!string.IsNullOrEmpty(query))){this.FillFromString(查询,urlencoded);}}#endregion#region参数publicstringthis[stringkey]{get{returnthis.First(x=>string.Equals(x.Key,key,StringComparison.OrdinalIgnore案例)).价值;}set{this.First(x=>string.Equals(x.Key,key,StringComparison.OrdinalIgnoreCase)).Value=value;}}#endregion#region公共方法publicvoidAdd(stringkey,stringvalue){this.Add(newHttpValue(key,value));}publicboolContainsKey(stringkey){returnthis.Any(x=>string.Equals(x.Key,key,StringComparison.OrdinalIgnoreCase));}publicstring[]GetValues(stringkey){returnthis.Where(x=>string.Equals(x.Key,key,StringComparison.OrdinalIgnoreCase)).Select(x=>x.Value).ToArray();}publicvoidRemove(stringkey){this.Where(x=>string.Equals(x.Key,key,StringComparison.OrdinalIgnoreCase)).ToList().ForEach(x=>this.Remove(x));}publicoverridestringToString(){returnthis.ToString(true);}publicvirtualstringToString(boolurlencoded){returnthis.ToString(urlencoded,null);}publicvirtualstringToString(boolurlencoded,IDictionaryexcludeKeys){if(this.Count==0){returnstring.Empty;}斯特里ngBuilderstringBuilder=newStringBuilder();foreach(HttpValueiteminthis){stringkey=item.Key;如果((excludeKeys==null)||!excludeKeys.Contains(key)){stringvalue=item.Value;if(urlencoded){//如果.NET4.5及更高版本(感谢@Paya)key=WebUtility.UrlDecode(key);//如果.NET4.0改用它。//key=Uri.EscapeDataString(key);}if(stringBuilder.Length>0){stringBuilder.Append('&');}stringBuilder.Append((key!=null)?(key+"="):string.Empty);if((value!=null)&&(value.Length>0)){if(urlencoded){value=Uri.EscapeDataString(value);}stringBuilder.Append(值);}}}返回stringBuilder.ToString();}#endregion#region私有方法privatevoidFillFromString(stringquery,boolurlencoded){intnum=(query!=null)?查询长度:0;对于(inti=0;i=0){str=query.Substring(startIndex,num4-startIndex);str2=query.Substring(num4+1,(i-num4)-1);}else{str2=query.Subst环(开始索引,我-开始索引);}if(urlencoded){this.Add(Uri.UnescapeDataString(str),Uri.UnescapeDataString(str2));}else{this.Add(str,str2);}if((i==(num-1))&&(query[i]=='&')){this.Add(null,string.Empty);}}}#endregion}UPDATE已更新,因此HttpValueCollection现在继承自Collection而不是List,如注释中突出显示的Update2已更新以使用WebUtility.UrlDecode,如果使用.NET4.5,感谢@Paya。你也可以这样实现它:publicstaticclassHttpUtility{publicstaticDictionaryParseQueryString(Uriuri){varquery=uri.Query.Substring(uri.Query.IndexOf('?')+1);//+1表示跳过'?'varpairs=query.Split('&');返回对.Select(o=>o.Split('=')).Where(items=>items.Count()==2).ToDictionary(pair=>Uri.UnescapeDataString(pair[0]),pair=>Uri.UnescapeDataString(对[1]));这是一个单元测试:publicclassHttpParseQueryValuesTests{[TestCase("http://www.example.com",0,"","")][TestCase("http://www.example.com?query=value",1,"query","value")]publicvoidWhen_parsing_http_query_then_should_have_these_values(stringuri,intexpectedParamCount,stringexpectedKey,stringexpectedValue){varqueryParams=HttpUtility.ParseQueryString(newUri(uri));}queryParams.Count.Should().Be(expectedParamCount);如果(queryParams.Count>0)queryParams[expectedKey].Should().Be(expectedValue);当您从字符串IDiction实例化Url对象时,我的Flurl库是一个PCLary它将查询字符串解析为IDictionary:使用Flurl;varurl=newUrl("http://...");//从url.QueryParams字典中获取值相关的解析逻辑在这Flurl很小,但是如果你想的话,可以随意滑动这些。我今天做了一个nuget包,它可以进行基本的查询构建和解析。它专供个人使用,但可从nuget.com存储库获得。供个人使用,意味着它可能不完全符合“http查询规范”。这里的Nuget链接是基于字典的,因此不支持重复键,主要是因为我不知道你为什么要...(有人能启发我吗?)它有1个类说支持添加、获取参数、检查它是否包含对键的查询......以及一个解析键并返回查询实例的静态方法。以上就是C#学习教程:HttpUtility.ParseQueryString的可移植类库(PCL)版分享的全部内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
