يقوم RestSharp بترميز المساحات في معلمات النموذج في النص كـ %20
أو +
أو لا يعمل على الإطلاق ، اعتمادًا على تفضيل المستخدم.
يقوم RestSharp بترميز المسافات في معلمات النموذج في النص كـ +
.
" "
) بحرف زائد ( "+"
)نحن نستدعي واجهة برمجة تطبيقات تابعة لجهة خارجية تتطلب فصل قيمة المعلمة بمسافات (على سبيل المثال ، 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
؟
سيكون من الجيد أيضًا أن تأتي باقتراح لإصلاح هذا ، أو طلب سحب.
لقد واجهت هذا للتو أيضًا ، مخترقة واجهة برمجة التطبيقات التي تقبل فقط '٪ 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
هنا؟
أعتقد أنه سيكون من الأسهل الحصول عليه مثل هذا:
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 نعم! سيكون ذلك رائعا. 👍
سيصدر في الإصدار القادم.