Restsharp: ترميز حرف المسافة ("") كـ "٪ 20" مقابل "+"

تم إنشاؤها على ٩ يوليو ٢٠١٨  ·  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

وصف

نحن نستدعي واجهة برمجة تطبيقات تابعة لجهة خارجية تتطلب فصل قيمة المعلمة بمسافات (على سبيل المثال ، 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 / x-www-form-urlencoded إلى أنه يجب ترميز المسافات على أنها + ، ومع ذلك فإن %20 يتبع أيضًا المواصفات ، ولا تقبل جميع أنظمة الجهات الخارجية + كبديل عن حرف المسافة بغض النظر عن المواصفات.

ملحوظة: هل هناك حل بديل لهذا لتشفير نص النموذج كـ param=ABC%20DEF ؟

ال 7 كومينتر

سيكون من الجيد أيضًا أن تأتي باقتراح لإصلاح هذا ، أو طلب سحب.

لقد واجهت هذا للتو أيضًا ، مخترقة واجهة برمجة التطبيقات التي تقبل فقط '٪ 20' وليس '+' لمعلمات GET في استدعاء REST ، لكن السبب الجذري متطابق.

الحل الواضح هو السماح بطريقة ما لتجاوز سلوك EncodeParameter للسماح باستخدام EscapeDataString بدلاً من UrlEncode

هناك عدد من سلاسل الرسائل الشاملة حول تجاوز سعة المكدس (على سبيل المثال https://stackoverflow.com/questions/602642/server-urlencode-vs-httputility-urlencode) حول هذا الأمر ، ولكن في النهاية ليس من الواضح ما هو السلوك الصحيح في الواقع .. . وسيكون من الملائم جدًا أن يكون لديك طريقة ما لاختيار ما تحتاجه ، بدلاً من استخدام UrlEncode دائمًا ، وهو بالتأكيد ليس السلوك الصحيح في بعض الحالات.

كحل بديل ، بشكل أساسي ، لا تستخدم أي شيء يعين Parameters ، وقم بذلك يدويًا.

أعتقد أن أفضل طريقة لتنفيذ هذا ... ربما تكون واجهة IParameterEncoder بواجهة DefaultParameterEncoder تستدعي HttpUtility.UrlEncode(...) والتي تم تعيينها على أنها التطبيق الافتراضي ، ولكن يمكن أن تكون كذلك تم تجاوزها في مكان ما. هل من المنطقي وضعه في RestClient ، أم يجب أن يكون في Http مثل مكان الخاصية IWebProxy هنا؟

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 التقييمات