2

動的クエリ文字列を使用して URI アドレスを作成する必要があり、コードを介してそれらを作成する快適な方法を探しています。

System.Net.Http アセンブリを参照しましたが、このケースのクラスまたはメソッドが見つかりません。この API はこれを提供しませんか? StackOverflow での私の検索結果は、System.Web の HttpUtility クラスを使用していますが、クラス ライブラリで ASP.Net コンポーネントを参照したくありません。

http://www.myBase.com/get?a=1&b=cのような URI が必要です。

助けてくれてありがとう!

更新 (2013/9/8):

私の解決策は、System.Net.WebUtilitiy クラスを使用して値をエンコードする URI ビルダーを作成することでした (残念ながら、インポートされた NuGet パッケージは厳密な名前のキーを提供しませんでした)。これが私のコードです:

/// <summary>
/// Helper class for creating a URI with query string parameter.
/// </summary>
internal class UrlBuilder
{
    private StringBuilder UrlStringBuilder { get; set; }
    private bool FirstParameter { get; set; }

    /// <summary>
    /// Creates an instance of the UriBuilder
    /// </summary>
    /// <param name="baseUrl">the base address (e.g: http://localhost:12345)</param>
    public UrlBuilder(string baseUrl)
    {
        UrlStringBuilder = new StringBuilder(baseUrl);
        FirstParameter = true;
    }

    /// <summary>
    /// Adds a new parameter to the URI
    /// </summary>
    /// <param name="key">the key </param>
    /// <param name="value">the value</param>
    /// <remarks>
    /// The value will be converted to a url valid coding.
    /// </remarks>
    public void AddParameter(string key, string value)
    {
        string urlEncodeValue = WebUtility.UrlEncode(value);

        if (FirstParameter)
        {
            UrlStringBuilder.AppendFormat("?{0}={1}", key, urlEncodeValue);
            FirstParameter = false;
        }
        else
        {
            UrlStringBuilder.AppendFormat("&{0}={1}", key, urlEncodeValue);
        }

    }

    /// <summary>
    /// Gets the URI with all previously added paraemter
    /// </summary>
    /// <returns>the complete URI as a string</returns>
    public string GetUrl()
    {
        return UrlStringBuilder.ToString();
    }
}

これが StackOverflow の誰かに役立つことを願っています。私のリクエストは機能しています。

ビョルン

4

3 に答える 3

2

Flurl [開示: 私は著者です] は、URL を構築し、(オプションで) 呼び出すための流暢な API を備えた移植可能なクラス ライブラリです。

using Flurl;
using Flurl.Http; // if you need it

var url = "http://www.myBase.com"
    .AppendPathSegment("get")
    .SetQueryParams(new { a = 1, b = "c" }) // multiple
    .SetQueryParams(dict)                   // multiple with an IDictionary
    .SetQueryParam("name", "value")          // one by one

    // if you need to call the URL with HttpClient...

    .WithOAuthBearerToken("token")
    .WithHeaders(new { a = "x", b = "y" })
    .ConfigureHttpClient(client => { /* access HttpClient directly */ })
    .PostJsonAsync(new { first_name = firstName, last_name = lastName });

いずれの場合も、クエリ文字列の値は URL エンコードされます。Flurl には、気の利いた一連のHTTP テスト機能も含まれています。完全なパッケージは NuGet で入手できます。

PM> Install-Package Flurl.Http

またはスタンドアロンの URL ビルダーのみ:

PM> Install-Package Flurl

于 2014-05-07T15:42:48.770 に答える
2

Tavis.Linkに依存する場合は、 URI テンプレートを使用してパラメーターを指定できます。

    [Fact]
    public void SOQuestion18302092()
    {
        var link = new Link();
        link.Target = new Uri("http://www.myBase.com/get{?a,b}");

        link.SetParameter("a","1");
        link.SetParameter("b", "c");

        var request = link.CreateRequest();
        Assert.Equal("http://www.myBase.com/get?a=1&b=c", request.RequestUri.OriginalString);
        
        
    }

Github repoの Tavis.Link でできることの例が他にもいくつかあります。

于 2013-08-19T15:19:15.950 に答える
0

クエリ文字列:

データを書き込むには:

Server.Transfer("WelcomePage.aspx?FirstName=" + Server.UrlEncode(fullName[0].ToString()) +
                                        "&LastName=" + Server.UrlEncode(fullName[1].ToString()));

書き込まれたデータを取得するには:

Server.UrlDecode(Request.QueryString["FirstName"].ToString()) + " "
                                                + Server.UrlDecode(Request.QueryString["LastName"].ToString());
于 2013-08-18T18:33:29.970 に答える