System.Net.HttpClient পেতে কোয়েরি স্ট্রিং তৈরি করুন


184

যদি আমি System.Net.Http ক্লায়েন্ট ব্যবহার করে কোনও এইচটিপি পেতে অনুরোধ জানাতে চাই তবে প্যারামিটারগুলি যুক্ত করার জন্য কোনও এপিআই নেই বলে মনে হচ্ছে, এটি কি সঠিক?

ক্যোরি স্ট্রিং তৈরির জন্য কি এমন কোনও সহজ এপিআই পাওয়া যায় যা কোনও নাম মান সংগ্রহ এবং ইউআরএলগুলি এনকোডিং এবং এরপরে অবশেষে সেগুলি সংযুক্ত করার সাথে জড়িত না? আমি রেস্টশার্পের এপিআই (যেমন অ্যাডপ্যারামিটার (..)) এর মতো কিছু ব্যবহার করার আশা করছিলাম


@ মিশেল পেরেনউড আপনি স্বীকৃত উত্তরের সাথে এনকোডিংয়ের প্রয়োজনীয় উত্তরগুলি ব্যবহার করে পুনর্বিবেচনা করতে চাইতে পারেন, নীচে আমার ব্যাখ্যাটি দেখুন
অবৈধ-অভিবাসী

উত্তর:


309

যদি আমি System.Net.Http ক্লায়েন্ট ব্যবহার করে কোনও এইচটিপি পেতে অনুরোধ জানাতে চাই তবে প্যারামিটারগুলি যুক্ত করার জন্য কোনও এপিআই নেই বলে মনে হচ্ছে, এটি কি সঠিক?

হ্যাঁ.

ক্যোরি স্ট্রিং তৈরির জন্য কি এমন কোনও সহজ এপিআই পাওয়া যায় যা কোনও নাম মান সংগ্রহ এবং ইউআরএলগুলি এনকোডিং এবং এরপরে অবশেষে সেগুলি সংযুক্ত করার সাথে জড়িত না?

নিশ্চিত:

var query = HttpUtility.ParseQueryString(string.Empty);
query["foo"] = "bar<>&-baz";
query["bar"] = "bazinga";
string queryString = query.ToString();

আপনাকে প্রত্যাশিত ফলাফল দেবে:

foo=bar%3c%3e%26-baz&bar=bazinga

আপনি UriBuilderক্লাসটি দরকারী হিসাবেও পেতে পারেন :

var builder = new UriBuilder("http://example.com");
builder.Port = -1;
var query = HttpUtility.ParseQueryString(builder.Query);
query["foo"] = "bar<>&-baz";
query["bar"] = "bazinga";
builder.Query = query.ToString();
string url = builder.ToString();

আপনাকে প্রত্যাশিত ফলাফল দেবে:

http://example.com/?foo=bar%3c%3e%26-baz&bar=bazinga

আপনি নিজের HttpClient.GetAsyncপদ্ধতিতে নিরাপদে খাওয়ানোর চেয়ে আরও বেশি কিছু করতে পারেন ।


9
ইউএনটি নেট .NET- এ হ্যান্ডলিংয়ের ক্ষেত্রে এটি সর্বশ্রেষ্ঠ। ম্যানুয়ালি ইউআরএল এনকোডিং এবং স্ট্রিং কনটেনটেশন বা স্ট্রিং বিল্ডার বা যা কিছু করার দরকার নেই। উরিবিল্ডার শ্রেণি এমনকি খণ্ডের #সম্পত্তি ব্যবহার করার জন্য এমনকি ইউআরএলগুলিকে টুকরো টুকরো টুকরো করে পরিচালনা করবে handle আমি বহু লোক অন্তর্নির্মিত সরঞ্জামগুলি ব্যবহার না করে ম্যানুয়ালি ইউআরএলগুলি হ্যান্ডেল করার ভুল করতে দেখেছি।
দারিন দিমিত্রভ

6
NameValueCollection.ToString()সাধারণত কোয়েরি স্ট্রিংগুলি তৈরি করে না এবং এমন কোনও দলিলও নেই যা উল্লেখ করে যে ToStringফলস্বরূপ কাজটি ParseQueryStringকরা একটি নতুন ক্যোয়ারী স্ট্রিংয়ের ফলস্বরূপ ঘটবে, সুতরাং সেই কার্যকারিতাটির কোনও গ্যারান্টি নেই বলে যে কোনও সময় ভেঙে যেতে পারে।
ম্যাথু

11
এইচটিপিটিউটিলিটি সিস্টেমটিতে রয়েছে e ওয়েব যা পোর্টেবল রানটাইম-এ উপলব্ধ নয়। এটি আশ্চর্যজনক বলে মনে হয় যে এই কার্যকারিতাটি সাধারণত শ্রেণিকালীন লাইব্রেরিতে পাওয়া যায় না।
ক্রিস এল্ডারেজ

82
এই সমাধান তাত্পর্যজনক। .নেটের যথাযথ ক্যোরিস্ট্রিং বিল্ডার থাকা উচিত।
কুগেল

8
খালি স্ট্রিংয়ে পাস করা কোনও ইউটিলিটি পদ্ধতি কল করে আপনি যে সমাধানটি কেবলমাত্র অভ্যন্তরীণ শ্রেণিতে লুকিয়ে থাকতে পারেন তা হ'ল একটি মার্জিত সমাধান বলা যায় না।
কুগেল

79

যারা অন্তর্ভুক্ত করা চাই না System.Webপ্রকল্প ইতোমধ্যেই এটি ব্যবহার করবেন না, আপনি ব্যবহার করতে পারেন FormUrlEncodedContentথেকে System.Net.Httpএবং নিচের মত কিছু করতে:

কিভালুভাইয়ার সংস্করণ

string query;
using(var content = new FormUrlEncodedContent(new KeyValuePair<string, string>[]{
    new KeyValuePair<string, string>("ham", "Glazed?"),
    new KeyValuePair<string, string>("x-men", "Wolverine + Logan"),
    new KeyValuePair<string, string>("Time", DateTime.UtcNow.ToString()),
})) {
    query = content.ReadAsStringAsync().Result;
}

অভিধান সংস্করণ

string query;
using(var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
    { "ham", "Glaced?"},
    { "x-men", "Wolverine + Logan"},
    { "Time", DateTime.UtcNow.ToString() },
})) {
    query = content.ReadAsStringAsync().Result;
}

আপনি কেন ব্যবহারের বিবৃতি ব্যবহার করবেন?
ইয়ান ওয়ারবার্টন

সংস্থানগুলি মুক্ত করার সম্ভাবনা থাকলেও এটি শীর্ষে রয়েছে। এটি করবেন না।
কোডি

5
কেভিপি অ্যারের পরিবর্তে অভিধান <স্ট্রিং, স্ট্রিং> ব্যবহার করে এটি আরও সংক্ষিপ্ত হতে পারে। তারপরে ইনিশিয়ালাইজার সিনট্যাক্স ব্যবহার করে: {"হ্যাম", "গ্ল্যাজড?" }
শান বি

@ সিয়ানব এটি একটি দুর্দান্ত ধারণা, বিশেষত প্যারামিটারগুলির গতিশীল / অজানা তালিকা যুক্ত করতে কিছু ব্যবহার করার সময়। এই উদাহরণটির জন্য এটি যেহেতু এটি একটি "স্থির" তালিকার তালিকা, তাই কোনও অভিধানের ওভারহেডের পক্ষে এটি উপযুক্ত বলে মনে হয় নি।
রোস্তভ

6
@ কোদি আপনি না ব্যবহার করতে বলছেন কেন dispose? পুনরায় ব্যবহারের মতো মতো যুক্তিযুক্ত না হলে আমি সর্বদা নিষ্পত্তি করি HttpClient
ড্যান ফ্রেডম্যান

41

টিএল; ডিআর: স্বীকৃত সংস্করণটি ব্যবহার করবেন না কারণ এটি ইউনিকোড অক্ষর পরিচালনা করার ক্ষেত্রে সম্পূর্ণরূপে ভেঙে গেছে এবং অভ্যন্তরীণ এপিআই কখনও ব্যবহার করবেন না

আমি গ্রহণযোগ্য সমাধানের সাথে অদ্ভুত ডাবল এনকোডিংয়ের সমস্যাটি পেয়েছি:

সুতরাং, আপনি যদি এমন অক্ষরগুলি নিয়ে কাজ করছেন যা এনকোড করা দরকার, স্বীকৃত সমাধান ডাবল এনকোডিংয়ের দিকে নিয়ে যায়:

  • ক্যোয়ারী প্যারামিটারগুলি NameValueCollectionইনডেক্সার ব্যবহার করে স্বয়ংক্রিয়ভাবে এনকোড হয় ( এবং এটি ব্যবহার করে UrlEncodeUnicode, নিয়মিত প্রত্যাশিত নয় UrlEncode(!) )
  • তারপরে, আপনি যখন কল করবেন uriBuilder.Uriএটি নির্মাণকারী Uriব্যবহার করে নতুন তৈরি করে যা আরও একবার এনকোডিং করে (সাধারণ url এনকোডিং)
  • এটি করে এড়ানো যায় নাuriBuilder.ToString() (যদিও এটি প্রত্যাবর্তন করে Uriযা সঠিকভাবে IMO কমপক্ষে অসঙ্গতি, সম্ভবত কোনও বাগ, তবে এটি অন্য প্রশ্ন) এবং তারপরে HttpClientপদ্ধতি গ্রহণ করার স্ট্রিংটি ব্যবহার করে - ক্লায়েন্টটি এখনও Uriআপনার পাস করা স্ট্রিংটি তৈরি করে:new Uri(uri, UriKind.RelativeOrAbsolute)

ছোট, তবে সম্পূর্ণ তিরস্কার:

var builder = new UriBuilder
{
    Scheme = Uri.UriSchemeHttps,
    Port = -1,
    Host = "127.0.0.1",
    Path = "app"
};

NameValueCollection query = HttpUtility.ParseQueryString(builder.Query);

query["cyrillic"] = "кирилиця";

builder.Query = query.ToString();
Console.WriteLine(builder.Query); //query with cyrillic stuff UrlEncodedUnicode, and that's not what you want

var uri = builder.Uri; // creates new Uri using constructor which does encode and messes cyrillic parameter even more
Console.WriteLine(uri);

// this is still wrong:
var stringUri = builder.ToString(); // returns more 'correct' (still `UrlEncodedUnicode`, but at least once, not twice)
new HttpClient().GetStringAsync(stringUri); // this creates Uri object out of 'stringUri' so we still end up sending double encoded cyrillic text to server. Ouch!

আউটপুট:

?cyrillic=%u043a%u0438%u0440%u0438%u043b%u0438%u0446%u044f

https://127.0.0.1/app?cyrillic=%25u043a%25u0438%25u0440%25u0438%25u043b%25u0438%25u0446%25u044f

আপনি দেখতে পাচ্ছেন, আপনি uribuilder.ToString()+ httpClient.GetStringAsync(string)বা uriBuilder.Uri+ httpClient.GetStringAsync(Uri)ডাবল এনকোডড প্যারামিটার প্রেরণ শেষ না করেই কোনও ব্যাপার নয়

স্থির উদাহরণ হতে পারে:

var uri = new Uri(builder.ToString(), dontEscape: true);
new HttpClient().GetStringAsync(uri);

তবে এটি অপ্রচলিত Uri কনস্ট্রাক্টর ব্যবহার করে

উইন্ডোজ সার্ভারে আমার সর্বশেষ Uri.NET- এ পিএস, বুল ডক মন্তব্য সহ নির্মাতা বলেছেন "অপ্রচলিত, ডানসেক্টপ সর্বদা মিথ্যা", তবে বাস্তবে প্রত্যাশায় কাজ করে (পালিয়ে যাওয়া এড়িয়ে যায়)

সুতরাং এটি অন্য বাগের মতো দেখাচ্ছে ...

এমনকি এটিও সাধারণভাবে ভুল - এটি সার্ভারে UrlEncodedUnicode প্রেরণ করে, কেবল সার্ভারের প্রত্যাশা অনুযায়ী urlCoded হয় না

আপডেট: আরও একটি বিষয় হ'ল নেমভ্যালিউ কালেকশনটি আসলে আরলিনকোড ইউনিকোড করে, যা আর ব্যবহার করা হয় না বলে মনে করা হয় এবং এটি নিয়মিত url.encode / ডিকোডের সাথে বেমানান ( URL টি কোয়েরিতে নেমভ্যালু সংগ্রহটি দেখুন ? )।

সুতরাং নীচের লাইনটি হ'ল: এই হ্যাকটি কখনই ব্যবহার করবেন নাNameValueCollection query = HttpUtility.ParseQueryString(builder.Query); কারণ এটি আপনার ইউনিকোড ক্যোয়ারী প্যারামিটারগুলিকে গোলমাল করবে। কেবল ম্যানুয়ালি ক্যোয়ারী তৈরি করুন এবং এটি নির্ধারণ করুন UriBuilder.Queryযা প্রয়োজনীয় এনকোডিং করবে এবং তারপরে উরি ব্যবহার করবে UriBuilder.Uri

কোড ব্যবহার করে নিজেকে আঘাত করার প্রধান উদাহরণ যা এ জাতীয় ব্যবহার করা হবে না বলে মনে করা হয়


16
আপনি কি এই উত্তরটিতে একটি সম্পূর্ণ ইউটিলিটি ফাংশন যুক্ত করতে পারেন যা কাজ করে?
মাফু

8
আমি এটি সম্পর্কে দ্বিতীয় মাফু: আমি উত্তরের মাধ্যমে পড়েছি তবে কোনও সিদ্ধান্তে নেই। এর কোন নির্দিষ্ট উত্তর আছে?
রিচার্ড গ্রিফিথস

3
আমি এই সমস্যার সুনির্দিষ্ট উত্তরও দেখতে চাই
পোনেস

এই সমস্যার সুনির্দিষ্ট উত্তরটি হ'ল ব্যবহার করা var namedValues = HttpUtility.ParseQueryString(builder.Query), তবে তারপরে প্রত্যাবর্তিত নেমভ্যালু কালেকশনটি ব্যবহার না করে তাৎক্ষণিকভাবে এটিকে একটি অভিধানে রূপান্তরিত var dic = values.ToDictionary(x => x, x => values[x]); করুন : অভিধানে নতুন মান যুক্ত করুন, তারপরে এটি নির্মাণকারীর কাছে পাস করুন FormUrlEncodedContentএবং ReadAsStringAsync().Resultএটিতে কল করুন। এটি আপনাকে একটি যথাযথ এনকোডযুক্ত ক্যোরিয় স্ট্রিং দেয় যা আপনি ইউরিবিল্ডারকে আবার নির্ধারণ করতে পারেন।
ট্রায়ঙ্কো

আপনি আসলে করতে পারেন শুধু যে সব পরিবর্তে NamedValueCollection.ToString ব্যবহার করেন, কিন্তু শুধুমাত্র আপনি পরিবর্তন যদি কোনো app.config / web.config সেটিং যে ব্যবহার করা থেকে আটকায় ASP.NET '% uXXXX' এনকোডিং: <add key="aspnet:DontUsePercentUUrlEncoding" value="true" />। : আমি এই আচরণের উপর নির্ভর করবে না, তাই এটি FormUrlEncodedContent বর্গ ব্যবহার করতে ভালো, যেমন আগের উত্তরের দ্বারা প্রদর্শিত stackoverflow.com/a/26744471/88409
Triynko

41

একটি এএসপি.এনইটি কোর প্রকল্পে আপনি কোয়েরিহেল্পার্স ক্লাসটি ব্যবহার করতে পারেন।

// using Microsoft.AspNetCore.WebUtilities;
var query = new Dictionary<string, string>
{
    ["foo"] = "bar",
    ["foo2"] = "bar2",
    // ...
};

var response = await client.GetAsync(QueryHelpers.AddQueryString("/api/", query));

2
এটি বিরক্তিকর যে এই প্রক্রিয়াটি সহ আপনি এখনও একই কীটির জন্য একাধিক মান প্রেরণ করতে পারবেন না। আপনি যদি কেবল ফু এর অংশ হিসাবে "বার" এবং "বার 2" প্রেরণ করতে চান তবে এটি সম্ভব নয়।
m0g

2
এটি আধুনিক অ্যাপ্লিকেশনগুলির জন্য একটি দুর্দান্ত উত্তর, আমার দৃশ্যে কাজ করে, সহজ এবং পরিষ্কার। তবে, আমার কোনও পালানোর ব্যবস্থা দরকার নেই - পরীক্ষা করা হয়নি।
প্যাট্রিক স্টাল্ফ

এই নিউগেট প্যাকেজটি লক্ষ্য করে। নেট স্ট্যান্ডার্ড ২.০ যার অর্থ আপনি এটি পুরো। নেট ফ্রেমওয়ার্কে ব্যবহার করতে পারেন 4..6.১+
এডিউইল্ড

24

আপনি ফ্লারল [প্রকাশ: আমি লেখক] যাচাই করতে চাইতে পারেন, fluচ্ছিক সহযোগী লিবের সাথে একটি সাবলীল ইউআরএল নির্মাতা যা এটিকে একটি পূর্ণ- বিকশিত আরএসটি ক্লায়েন্টে প্রসারিত করে।

var result = await "https://api.com"
    // basic URL building:
    .AppendPathSegment("endpoint")
    .SetQueryParams(new {
        api_key = ConfigurationManager.AppSettings["SomeApiKey"],
        max_results = 20,
        q = "Don't worry, I'll get encoded!"
    })
    .SetQueryParams(myDictionary)
    .SetQueryParam("q", "overwrite q!")

    // extensions provided by Flurl.Http:
    .WithOAuthBearerToken("token")
    .GetJsonAsync<TResult>();

আরও বিশদ জন্য ডক্স পরীক্ষা করে দেখুন। সম্পূর্ণ প্যাকেজটি নুগেটে উপলভ্য:

PM> Install-Package Flurl.Http

অথবা কেবলমাত্র একা ইউআরএল বিল্ডার:

PM> Install-Package Flurl


2
Uriআপনি নিজের ক্লাসের পরিবর্তে প্রসারিত বা শুরু করবেন না কেন string?
এমপেন

2
প্রযুক্তিগতভাবে আমি আমার নিজস্ব Urlক্লাস দিয়ে শুরু করেছি । উপরেরটি new Url("https://api.com").AppendPathSegment...ব্যক্তিগতভাবে আমি কম কীস্ট্রোকের কারণে স্ট্রিং এক্সটেনশানগুলিকে পছন্দ করি এবং ডক্সে সেগুলিতে মানকযুক্ত, তবে আপনি এটি যেভাবেই করতে পারেন।
টড মেনিয়ার

বিষয় ছাড়াই, তবে সত্যিই দুর্দান্ত কাজ, আমি এটি দেখার পরে এটি ব্যবহার করছি। পাশাপাশি আইএইচটিপিপ্লায়েন্টফ্যাক্টরি ব্যবহার করার জন্য ধন্যবাদ
এড এস

4

Rostov এর পোস্ট হিসাবে একই লাইন বরাবর, আপনি যদি একটি রেফারেন্স অন্তর্ভুক্ত করতে না চান System.Webআপনার প্রকল্পের মধ্যে, আপনি ব্যবহার করতে পারেন FormDataCollectionথেকে System.Net.Http.Formattingএবং নিচের মত কিছু করতে:

ব্যবহার System.Net.Http.Formatting.FormDataCollection

var parameters = new Dictionary<string, string>()
{
    { "ham", "Glaced?" },
    { "x-men", "Wolverine + Logan" },
    { "Time", DateTime.UtcNow.ToString() },
}; 
var query = new FormDataCollection(parameters).ReadAsNameValueCollection().ToString();

3

ডারিন একটি আকর্ষণীয় এবং চতুর সমাধানের প্রস্তাব দিয়েছিল, এবং এখানে এমন একটি বিকল্প যা অন্য বিকল্প হতে পারে:

public class ParameterCollection
{
    private Dictionary<string, string> _parms = new Dictionary<string, string>();

    public void Add(string key, string val)
    {
        if (_parms.ContainsKey(key))
        {
            throw new InvalidOperationException(string.Format("The key {0} already exists.", key));
        }
        _parms.Add(key, val);
    }

    public override string ToString()
    {
        var server = HttpContext.Current.Server;
        var sb = new StringBuilder();
        foreach (var kvp in _parms)
        {
            if (sb.Length > 0) { sb.Append("&"); }
            sb.AppendFormat("{0}={1}",
                server.UrlEncode(kvp.Key),
                server.UrlEncode(kvp.Value));
        }
        return sb.ToString();
    }
}

এবং তাই এটি ব্যবহার করার সময়, আপনি এটি করতে পারেন:

var parms = new ParameterCollection();
parms.Add("key", "value");

var url = ...
url += "?" + parms;

5
আপনি পুরো ক্যোয়ারী-স্ট্রিংয়ে নয়, লুপের অভ্যন্তরে আলাদাভাবে এনকোড করতে kvp.Keyএবং kvp.Valueপৃথক করতে চান (এভাবে অক্ষর &এবং =অক্ষরগুলি এনকোডিং নয়)।
ম্যাথু

ধন্যবাদ মাইক অন্যান্য প্রস্তাবিত সমাধানগুলি (নেমভ্যালিউ কালেকশন জড়িত) আমার পক্ষে কার্যকর হয়নি কারণ আমি একটি পিসিএল প্রকল্পে আছি, সুতরাং এটি একটি সঠিক বিকল্প ছিল। যারা অন্যদের ক্লায়েন্ট সাইড কাজ করছি জন্য, server.UrlEncodeসঙ্গে প্রতিস্থাপিত হতে পারেWebUtility.UrlEncode
বিসিএ

2

বা কেবল আমার উরি এক্সটেনশানটি ব্যবহার করে

কোড

public static Uri AttachParameters(this Uri uri, NameValueCollection parameters)
{
    var stringBuilder = new StringBuilder();
    string str = "?";
    for (int index = 0; index < parameters.Count; ++index)
    {
        stringBuilder.Append(str + parameters.AllKeys[index] + "=" + parameters[index]);
        str = "&";
    }
    return new Uri(uri + stringBuilder.ToString());
}

ব্যবহার

Uri uri = new Uri("http://www.example.com/index.php").AttachParameters(new NameValueCollection
                                                                           {
                                                                               {"Bill", "Gates"},
                                                                               {"Steve", "Jobs"}
                                                                           });

ফলাফল

http://www.example.com/index.php?Bill=Gates&Steve=Jobs


27
আপনি কি ইউআরএল এনকোডিং ভুলে যাননি?
কুগেল

1
পরিষ্কার, দরকারী সহায়ক তৈরি করতে এক্সটেনশনগুলি ব্যবহারের এটি দুর্দান্ত উদাহরণ। আপনি একটি কঠিন RestClient বিল্ডিং এর পথে করছি গৃহীত উত্তর সঙ্গে এই একত্রিত তাহলে
এমরান

2

জন্য RFC 6570 কোনো URI টেমপ্লেট গ্রন্থাগার আমি উন্নয়নশীল করছি এই ক্রিয়াকলাপটি সম্পাদনের করতে সক্ষম। সমস্ত এনকোডিং সেই আরএফসি অনুসারে আপনার জন্য পরিচালিত হয়। এই লেখার সময়, একটি বিটা রিলিজ পাওয়া যায় এবং এটি স্থিতিশীল 1.0 রিলিজ হিসাবে বিবেচিত না হওয়ার একমাত্র কারণ হ'ল ডকুমেন্টেশনটি আমার প্রত্যাশা পুরোপুরি পূরণ করে না (দেখুন # 17 , # 18 , # 32 , # 43 )।

আপনি হয় একা কোয়েরি স্ট্রিং তৈরি করতে পারেন:

UriTemplate template = new UriTemplate("{?params*}");
var parameters = new Dictionary<string, string>
  {
    { "param1", "value1" },
    { "param2", "value2" },
  };
Uri relativeUri = template.BindByName(parameters);

অথবা আপনি একটি সম্পূর্ণ ইউআরআই তৈরি করতে পারেন:

UriTemplate template = new UriTemplate("path/to/item{?params*}");
var parameters = new Dictionary<string, string>
  {
    { "param1", "value1" },
    { "param2", "value2" },
  };
Uri baseAddress = new Uri("http://www.example.com");
Uri relativeUri = template.BindByName(baseAddress, parameters);

1

যেহেতু আমাকে এই কয়েকবার পুনঃব্যবহার করতে হয়েছে, আমি এই ক্লাসটি নিয়ে এসেছি যা কেবল ক্যোরিয় স্ট্রিংটি কীভাবে রচিত তা বিমূর্ত করতে সহায়তা করে।

public class UriBuilderExt
{
    private NameValueCollection collection;
    private UriBuilder builder;

    public UriBuilderExt(string uri)
    {
        builder = new UriBuilder(uri);
        collection = System.Web.HttpUtility.ParseQueryString(string.Empty);
    }

    public void AddParameter(string key, string value) {
        collection.Add(key, value);
    }

    public Uri Uri{
        get
        {
            builder.Query = collection.ToString();
            return builder.Uri;
        }
    }

}

ব্যবহার এমন কিছু সহজ হবে:

var builder = new UriBuilderExt("http://example.com/");
builder.AddParameter("foo", "bar<>&-baz");
builder.AddParameter("bar", "second");
var uri = builder.Uri;

এটি ইউরি ফিরিয়ে দেবে: http://example.com/?foo=bar%3c%3e%26-বাজ & বার= সেকেন্ড


1

তারাস.রোশকো এর উত্তরে বর্ণিত ডাবল এনকোডিং সমস্যা এড়াতে এবং কোয়েরি প্যারামিটারগুলির সাথে সহজেই কাজ করার সম্ভাবনা রক্ষা করতে আপনি এর uriBuilder.Uri.ParseQueryString()পরিবর্তে ব্যবহার করতে পারেন HttpUtility.ParseQueryString()


1

গৃহীত উত্তরের উত্তম অংশ, ইউটিউইউইল্ডার.উরি.প্রেসকুয়ের স্ট্রিং () ব্যবহার করার পরিবর্তে এইচটিপি ইউটিলিটি.পার্সকিউয়ারি স্ট্রিং () ব্যবহার করুন:

var builder = new UriBuilder("http://example.com");
var query = builder.Uri.ParseQueryString();
query["foo"] = "bar<>&-baz";
query["bar"] = "bazinga";
builder.Query = query.ToString();
string url = builder.ToString();

অবগতির জন্য এই একটি রেফারেন্স দরকার System.Net.Http যেমন ParseQueryString()এক্সটেনশন পদ্ধতি মধ্যে নেই System
সানি প্যাটেল

0

"দারিন দিমিত্রভ" কে ধন্যবাদ, এটি হ'ল সম্প্রসারণ পদ্ধতি।

 public static partial class Ext
{
    public static Uri GetUriWithparameters(this Uri uri,Dictionary<string,string> queryParams = null,int port = -1)
    {
        var builder = new UriBuilder(uri);
        builder.Port = port;
        if(null != queryParams && 0 < queryParams.Count)
        {
            var query = HttpUtility.ParseQueryString(builder.Query);
            foreach(var item in queryParams)
            {
                query[item.Key] = item.Value;
            }
            builder.Query = query.ToString();
        }
        return builder.Uri;
    }

    public static string GetUriWithparameters(string uri,Dictionary<string,string> queryParams = null,int port = -1)
    {
        var builder = new UriBuilder(uri);
        builder.Port = port;
        if(null != queryParams && 0 < queryParams.Count)
        {
            var query = HttpUtility.ParseQueryString(builder.Query);
            foreach(var item in queryParams)
            {
                query[item.Key] = item.Value;
            }
            builder.Query = query.ToString();
        }
        return builder.Uri.ToString();
    }
}

-1

অভিধানকে কোয়েরিস্ট্রিংফোমে রূপান্তর করতে কোনও এক্সটেনশন পদ্ধতি তৈরি করার চেয়ে ভাল সমাধান আমি খুঁজে পাই না। ওয়ালিদ একে প্রস্তাবিত সমাধানটিও ভাল good

আমার সমাধান অনুসরণ করুন:

এক্সটেনশন পদ্ধতিটি তৈরি করুন:

public static class DictionaryExt
{
    public static string ToQueryString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary)
    {
        return ToQueryString<TKey, TValue>(dictionary, "?");
    }

    public static string ToQueryString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string startupDelimiter)
    {
        string result = string.Empty;
        foreach (var item in dictionary)
        {
            if (string.IsNullOrEmpty(result))
                result += startupDelimiter; // "?";
            else
                result += "&";

            result += string.Format("{0}={1}", item.Key, item.Value);
        }
        return result;
    }
}

এবং তাদের:

var param = new Dictionary<string, string>
          {
            { "param1", "value1" },
            { "param2", "value2" },
          };
param.ToQueryString(); //By default will add (?) question mark at begining
//"?param1=value1&param2=value2"
param.ToQueryString("&"); //Will add (&)
//"&param1=value1&param2=value2"
param.ToQueryString(""); //Won't add anything
//"param1=value1&param2=value2"

1
এই সমাধানটিতে প্যারামিটারগুলির যথাযথ URL এনকোডিং অনুপস্থিত এবং 'অবৈধ'
অক্ষরযুক্ত

উত্তর আপডেট করতে নিখরচায় এবং এনকোডিং লাইনটি অনুপস্থিত যুক্ত করুন, এটি কেবল কোডের একটি লাইন!
দিয়েগো মেন্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.