의 문자열에서 URL 매개 변수를 가져옵니다.그물
끈이 있어요.실제로 URL인 NET. 특정 매개 변수에서 값을 쉽게 가져올 수 있는 방법을 원합니다.
보통은 그냥.Request.Params["theThingIWant"]
하지만 이 문자열은 요청에서 나온 것이 아닙니다.새로 생성할 수 있습니다.Uri
이와 같은 항목:
Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);
사용할 수 있습니다myUri.Query
쿼리 문자열을 가져오는 중...하지만 그 다음엔 그것을 나눌 수 있는 어떤 변칙적인 방법을 찾아야 할 것 같아요.
제가 뭔가 명백한 것을 놓치고 있는 것일까요, 아니면 어떤 종류의 정규식을 만드는 것 외에는 이런 일을 할 수 있는 기본적인 방법이 없을까요?
정적 사용ParseQueryString
의 방법System.Web.HttpUtility
돌아오는 클래스NameValueCollection
.
Uri myUri = new Uri("http://www.example.com?param1=good¶m2=bad");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");
설명서는 http://msdn.microsoft.com/en-us/library/ms150046.aspx 에서 확인하십시오.
이것이 아마도 당신이 원하는 것일 것입니다.
var uri = new Uri("http://domain.test/Default.aspx?var1=true&var2=test&var3=3");
var query = HttpUtility.ParseQueryString(uri.Query);
var var2 = query.Get("var2");
어떤 이유로든 사용할 수 없거나 사용하지 않으려는 경우 다른 대안이 있습니다.HttpUtility.ParseQueryString()
.
이는 잘못된 형식의 쿼리 문자열에 대해 어느 정도 내성을 갖도록 설계되었습니다.http://test/test.html?empty=
값이 비어 있는 매개 변수가 됩니다.필요한 경우 호출자가 매개 변수를 확인할 수 있습니다.
public static class UriHelper
{
public static Dictionary<string, string> DecodeQueryParameters(this Uri uri)
{
if (uri == null)
throw new ArgumentNullException("uri");
if (uri.Query.Length == 0)
return new Dictionary<string, string>();
return uri.Query.TrimStart('?')
.Split(new[] { '&', ';' }, StringSplitOptions.RemoveEmptyEntries)
.Select(parameter => parameter.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries))
.GroupBy(parts => parts[0],
parts => parts.Length > 2 ? string.Join("=", parts, 1, parts.Length - 1) : (parts.Length > 1 ? parts[1] : ""))
.ToDictionary(grouping => grouping.Key,
grouping => string.Join(",", grouping));
}
}
시험
[TestClass]
public class UriHelperTest
{
[TestMethod]
public void DecodeQueryParameters()
{
DecodeQueryParametersTest("http://test/test.html", new Dictionary<string, string>());
DecodeQueryParametersTest("http://test/test.html?", new Dictionary<string, string>());
DecodeQueryParametersTest("http://test/test.html?key=bla/blub.xml", new Dictionary<string, string> { { "key", "bla/blub.xml" } });
DecodeQueryParametersTest("http://test/test.html?eins=1&zwei=2", new Dictionary<string, string> { { "eins", "1" }, { "zwei", "2" } });
DecodeQueryParametersTest("http://test/test.html?empty", new Dictionary<string, string> { { "empty", "" } });
DecodeQueryParametersTest("http://test/test.html?empty=", new Dictionary<string, string> { { "empty", "" } });
DecodeQueryParametersTest("http://test/test.html?key=1&", new Dictionary<string, string> { { "key", "1" } });
DecodeQueryParametersTest("http://test/test.html?key=value?&b=c", new Dictionary<string, string> { { "key", "value?" }, { "b", "c" } });
DecodeQueryParametersTest("http://test/test.html?key=value=what", new Dictionary<string, string> { { "key", "value=what" } });
DecodeQueryParametersTest("http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1%22",
new Dictionary<string, string>
{
{ "q", "energy+edge" },
{ "rls", "com.microsoft:en-au" },
{ "ie", "UTF-8" },
{ "oe", "UTF-8" },
{ "startIndex", "" },
{ "startPage", "1%22" },
});
DecodeQueryParametersTest("http://test/test.html?key=value;key=anotherValue", new Dictionary<string, string> { { "key", "value,anotherValue" } });
}
private static void DecodeQueryParametersTest(string uri, Dictionary<string, string> expected)
{
Dictionary<string, string> parameters = new Uri(uri).DecodeQueryParameters();
Assert.AreEqual(expected.Count, parameters.Count, "Wrong parameter count. Uri: {0}", uri);
foreach (var key in expected.Keys)
{
Assert.IsTrue(parameters.ContainsKey(key), "Missing parameter key {0}. Uri: {1}", key, uri);
Assert.AreEqual(expected[key], parameters[key], "Wrong parameter value for {0}. Uri: {1}", parameters[key], uri);
}
}
}
당신은 당신의 가치들을 반복해야 할 것 같습니다.myUri.Query
거기서 파싱을 합니다.
string desiredValue;
foreach(string item in myUri.Query.Split('&'))
{
string[] parts = item.Replace("?", "").Split('=');
if(parts[0] == "desiredKey")
{
desiredValue = parts[1];
break;
}
}
하지만 저는 이 코드를 여러 개의 잘못된 형식의 URL에서 테스트하지 않고는 사용하지 않을 것입니다.다음 중 일부 또는 모두에서 손상될 수 있습니다.
hello.html?
hello.html?valuelesskey
hello.html?key=value=hi
hello.html?hi=value?&b=c
- 기타
@앤드류와 @CZ폭스
저는 같은 버그를 가지고 있었고 그 원인이 매개 변수 1이 사실이기 때문이라는 것을 발견했습니다.http://www.example.com?param1
그리고 아닌param1
그것이 사람들이 기대하는 것입니다.
물음표 앞에 있는 모든 문자를 제거하고 물음표를 포함하면 이 문제가 해결됩니다.그래서 본질적으로 그것은HttpUtility.ParseQueryString
함수에는 물음표 뒤에 나오는 문자만 포함된 유효한 쿼리 문자열 매개 변수만 필요합니다.
HttpUtility.ParseQueryString ( "param1=good¶m2=bad" )
해결 방법:
string RawUrl = "http://www.example.com?param1=good¶m2=bad";
int index = RawUrl.IndexOf ( "?" );
if ( index > 0 )
RawUrl = RawUrl.Substring ( index ).Remove ( 0, 1 );
Uri myUri = new Uri( RawUrl, UriKind.RelativeOrAbsolute);
string param1 = HttpUtility.ParseQueryString( myUri.Query ).Get( "param1" );`
URI를 사용하여 쿼리 문자열 목록을 가져오거나 특정 매개 변수를 찾을 수 있습니다.
Uri myUri = new Uri("http://www.example.com?param1=good¶m2=bad");
var params = myUri.ParseQueryString();
var specific = myUri.ParseQueryString().Get("param1");
var paramByIndex = myUri.ParseQueryString().Get(2);
자세한 내용은 여기에서 확인할 수 있습니다. https://learn.microsoft.com/en-us/dotnet/api/system.uri?view=net-5.0
다음 해결 방법을 사용하여 첫 번째 매개 변수도 사용할 수 있습니다.
var param1 =
HttpUtility.ParseQueryString(url.Substring(
new []{0, url.IndexOf('?')}.Max()
)).Get("param1");
또는 URL을 모를 경우 (하드코딩을 방지하기 위해)AbsoluteUri
예...
//get the full URL
Uri myUri = new Uri(Request.Url.AbsoluteUri);
//get any parameters
string strStatus = HttpUtility.ParseQueryString(myUri.Query).Get("status");
string strMsg = HttpUtility.ParseQueryString(myUri.Query).Get("message");
switch (strStatus.ToUpper())
{
case "OK":
webMessageBox.Show("EMAILS SENT!");
break;
case "ER":
webMessageBox.Show("EMAILS SENT, BUT ... " + strMsg);
break;
}
.NET 리플렉터를 사용하여FillFromString
의 방법System.Web.HttpValueCollection
그러면 ASP 코드가 나옵니다.NET은 다음을 채우기 위해 사용합니다.Request.QueryString
수집.
단일 라인 LINQ 솔루션:
Dictionary<string, string> ParseQueryString(string query)
{
return query.Replace("?", "").Split('&').ToDictionary(pair => pair.Split('=').First(), pair => pair.Split('=').Last());
}
기본 페이지에서 QueryString(쿼리 문자열)을 불러옵니다.기본 페이지는 현재 페이지 URL을 의미합니다. 다음 코드를 사용할 수 있습니다.
string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");
이것은 사실 매우 간단하며, 저에게 효과가 있었습니다 :)
if (id == "DK")
{
string longurl = "selectServer.aspx?country=";
var uriBuilder = new UriBuilder(longurl);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["country"] = "DK";
uriBuilder.Query = query.ToString();
longurl = uriBuilder.ToString();
}
문자열에서 모든 쿼리 문자열을 반복 처리하려는 사용자용
foreach (var item in new Uri(urlString).Query.TrimStart('?').Split('&'))
{
var subStrings = item.Split('=');
var key = subStrings[0];
var value = subStrings[1];
// do something with values
}
다음은 포함할 dll을 언급하는 샘플입니다.
var testUrl = "https://www.google.com/?q=foo";
var data = new Uri(testUrl);
// Add a reference to System.Web.dll
var args = System.Web.HttpUtility.ParseQueryString(data.Query);
args.Set("q", "my search term");
var nextUrl = $"{data.Scheme}://{data.Host}{data.LocalPath}?{args.ToString()}";
매개 변수 이름을 아는 가장 쉬운 방법은 다음과 같습니다.
using System.Linq;
string loc = "https://localhost:5000/path?desiredparam=that_value&anotherParam=whatever";
var c = loc.Split("desiredparam=").Last().Split("&").First();//that_value
HttpContext.Current.Request.QueryString.Get("id");
언급URL : https://stackoverflow.com/questions/659887/get-url-parameters-from-a-string-in-net
'programing' 카테고리의 다른 글
다중 행 문자열에서 지정한 열을 쉼표로 구분된 단일 행으로 변환 (0) | 2023.05.11 |
---|---|
한 달의 마지막 날을 어떻게 얻을 수 있습니까? (0) | 2023.05.11 |
데이터 테이블:행 이름 및 열 이름으로 항목 값을 가져오는 방법(VB) (0) | 2023.05.11 |
npm이 프록시 뒤에서 작업할 수 있도록 설치(명령)하는 방법이 있습니까? (0) | 2023.05.11 |
mongodb 수집에서 판다의 데이터 프레임으로 데이터를 로드하려면 어떻게 해야 합니까? (0) | 2023.05.11 |