У меня есть некоторый код в разных местах, где у меня есть Dictionary<string,string>
, содержащий параметры, которые должны идти в строке запроса. У меня есть собственный код для форматирования, чтобы его можно было добавить в конец URL-адреса. Есть ли что-то встроенное в эту библиотеку, что сделает это за меня?
Есть ли простой способ форматирования строк запроса при использовании класса .NET HttpClient?
comment
возможный дубликат строки запроса сборки для System.Net.HttpClient get
- person Joe Enos   schedule 17.10.2013
comment
Я не совсем уверен, что понимаю, что вы имеете в виду, но разве следующее не делает то, что вы хотите? HttpUtility.UrlEncode ИЛИ Uri.EscapeUriString.
- person chue x   schedule 17.10.2013
comment
@chuex Я не пометил свой код как код, который испортил вопрос. У меня есть словарь, и я подумал, что HttpClient может предложить метод для преобразования его в строку запроса. Я думаю, что ссылка на повторяющийся вопрос может быть тем, что я хочу.
- person Brian Lyttle   schedule 17.10.2013
Ответы (1)
Возможно, вы захотите использовать UriTemplates для создания Uris. Синтаксис указан в RFC6570. Я написал библиотеку с пакетом nuget здесь.
С UriTemplates вы можете не только заполнять такие параметры запроса, как,
[Fact]
public void ShouldAllowUriTemplateWithQueryParamsWithOneValue()
{
var template = new UriTemplate("http://example.org/foo{?bar,baz}");
template.SetParameter("baz", "yo");
var uriString = template.Resolve();
Assert.Equal("http://example.org/foo?baz=yo", uriString);
}
Не беспокойтесь, если вы не укажете параметр строки запроса, токен будет удален.
Он также обрабатывает параметры пути,
[Fact]
public void ShouldAllowUriTemplateWithMultiplePathSegmentParameter()
{
var template = new UriTemplate("http://example.org/foo/{bar}/baz/{blar}");
template.SetParameter("bar", "yo");
template.SetParameter("blar", "yuck");
var uriString = template.Resolve();
Assert.Equal("http://example.org/foo/yo/baz/yuck", uriString);
}
и некоторые действительно изящные вещи с параметрами, которые являются списками и словарями,
[Fact]
public void ShouldAllowListAndSingleValueInQueryParam()
{
var template = new UriTemplate("http://example.org{/id*}{?fields,token}");
template.SetParameter("id", new List<string>() { "person", "albums" });
template.SetParameter("fields", new List<string>() { "id", "name", "picture" });
template.SetParameter("token", "12345");
var uriString = template.Resolve();
Assert.Equal("http://example.org/person/albums?fields=id,name,picture&token=12345", uriString);
}
и он будет обрабатывать все виды сложных проблем с кодировкой URI,
[Fact]
public void ShouldHandleUriEncoding()
{
var template = new UriTemplate("http://example.org/sparql{?query}");
template.SetParameter("query", "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?book ?who WHERE { ?book dc:creator ?who }");
var uriString = template.Resolve();
Assert.Equal("http://example.org/sparql?query=PREFIX%20dc%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%20SELECT%20%3Fbook%20%3Fwho%20WHERE%20%7B%20%3Fbook%20dc%3Acreator%20%3Fwho%20%7D", uriString);
}
[Fact]
public void ShouldHandleEncodingAParameterThatIsAUriWithAUriParameter()
{
var template = new UriTemplate("http://example.org/go{?uri}");
template.SetParameter("uri", "http://example.org/?uri=http%3A%2F%2Fexample.org%2F");
var uriString = template.Resolve();
Assert.Equal("http://example.org/go?uri=http%3A%2F%2Fexample.org%2F%3Furi%3Dhttp%253A%252F%252Fexample.org%252F", uriString);
}
Единственный элемент, который до сих пор не работает, — это кодирование двухбайтовых символов Unicode в URI. Существует также предварительная версия библиотеки PCL, позволяющая использовать ее в WinRT и на Windows Phone.
person
Darrel Miller
schedule
17.10.2013