Restsharp: ๊ณต๋ฐฑ ๋ฌธ์ž(" ")๋ฅผ "%20" ๋Œ€ "+"๋กœ ์ธ์ฝ”๋”ฉ

์— ๋งŒ๋“  2018๋…„ 07์›” 09์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: restsharp/RestSharp

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘

RestSharp๋Š” ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์„ค์ •์— ๋”ฐ๋ผ ๋ณธ๋ฌธ์˜ ์–‘์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๊ณต๋ฐฑ์„ %20 , + , ๋˜๋Š” ์ „ํ˜€ ์ธ์ฝ”๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™

RestSharp๋Š” ๋ณธ๋ฌธ์˜ ์–‘์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ณต๋ฐฑ์„ + ๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„

  1. POST ์š”์ฒญ ์ƒ์„ฑ
  2. ๋ณธ๋ฌธ ํ‚ค/๊ฐ’ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์— ๊ณต๋ฐฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒฐ๊ณผ HTTP ํ˜ธ์ถœ์€ ๊ณต๋ฐฑ ๋ฌธ์ž( " " )๋ฅผ ๋”ํ•˜๊ธฐ ๋ฌธ์ž( "+" )๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

๋ช…์„ธ์„œ

  • ๋ฒ„์ „: 105.2.3.0
  • ํ”Œ๋žซํผ: ASP.NET ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(.NET v4.6.2)

์†Œ์Šค ์ฐธ์กฐ

https://github.com/restsharp/RestSharp/blob/1805996d6f93226cdbf9dd1cc50b90423c1456c7/RestSharp/Http.cs#L322

์„ค๋ช…

๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋Š” ํƒ€์‚ฌ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: VALUE1 VALUE2 VALUE3 , ์ธ์ฝ”๋”ฉ: param=VALUE1%20VALUE2%20VALUE3 ). RestSharp๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Uri.EscapeDataString() ๋ฐ HttpUtility.UrlEncode ์˜ ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Uri.EscapeDataString("ABC DEF")
> ABC%20DEF
HttpUtility.UrlEncode("ABC DEF")
> ABC+DEF

RestSharp๋Š” ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐฉ์‹์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ(์„ ํƒ ์‚ฌํ•ญ) ์ด์Šค์ผ€์ดํ”„/์ธ์ฝ”๋”ฉ/์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HTTP application/x-www-form-urlencoded ์‚ฌ์–‘ ์—๋Š” ๊ณต๋ฐฑ์ด + ๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€๋งŒ %20 ๋„ ์‚ฌ์–‘์„ ๋”ฐ๋ฅด๋ฉฐ ๋ชจ๋“  ํƒ€์‚ฌ ์‹œ์Šคํ…œ์ด + ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

NB ์–‘์‹ ๋ณธ๋ฌธ์„ param=ABC%20DEF ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“  7 ๋Œ“๊ธ€

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด๋‚˜ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์•ˆํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

REST ํ˜ธ์ถœ์—์„œ GET ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด '+'๊ฐ€ ์•„๋‹Œ '%20'๋งŒ ํ—ˆ์šฉํ•˜๋Š” API๋ฅผ ์œ„๋ฐ˜ํ–ˆ์ง€๋งŒ ๊ทผ๋ณธ ์›์ธ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ฐฑํ•œ ํ•ด๊ฒฐ์ฑ…์€ $ UrlEncode EscapeDataString ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก EncodeParameter ์˜ ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๋Š” ์ผ์ข…์˜ ๋ฐฉ๋ฒ•์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ(์˜ˆ: https://stackoverflow.com/questions/602642/server-urlencode-vs-httputility-urlencode)์— ๋Œ€ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ™•์‹คํžˆ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ด ์•„๋‹Œ UrlEncode ๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ•„์š”ํ•œ ๊ฒƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ๋งค์šฐ ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ Parameters ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค... ์•„๋งˆ๋„ DefaultParameterEncoder ๊ฐ€ ์žˆ๋Š” HttpUtility.UrlEncode(...) IParameterEncoder ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ๋ณธ ๊ตฌํ˜„์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์ง€๋งŒ ์–ด๋”˜๊ฐ€์— ์žฌ์ •์˜. RestClient ์— ๋„ฃ๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด IWebProxy ์†์„ฑ์ด ์—ฌ๊ธฐ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Http ์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

https://github.com/restsharp/RestSharp/blob/1805996d6f93226cdbf9dd1cc50b90423c1456c7/RestSharp/Http.cs#L220

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    public Func<string, string> Encoder { get; set; } = s => HttpUtility.UrlEncode(s);

๋‹จ์ผ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@qJake ์ด๋ ‡๊ฒŒ
https://github.com/restsharp/RestSharp/commit/62e95bd03a0c64ac3933b648be4ee18d6c220ad7#diff -fbb0205ba27639004072c041141c4459R133

        /// <summary>
        /// Allows to use a custom way to encode parameters
        /// </summary>
        /// <param name="encoder">A delegate to encode parameters</param>
        /// <example>client.UseUrlEncoder(s => HttpUtility.UrlEncode(s));</example>
        /// <returns></returns>
        public IRestClient UseUrlEncoder(Func<string, string> encoder)
        {
            Encode = encoder;
            return this;
        }

@alexeyzimarev ๋„ค! ๊ทธ๊ฒƒ์€ ํ™˜์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ‘

๋‹ค์Œ ๋ฒ„์ „์—์„œ ์ถœ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰