Angular.js: يجب أن يكون encodeUriSegment في معلمات ترميز المورد اختياريًا

تم إنشاؤها على ١٩ سبتمبر ٢٠١٢  ·  55تعليقات  ·  مصدر: angular/angular.js

عند وجود مورد $ وإرسال معلمة لاستخدامها في عنوان url ، سيكون من الجيد إذا كان هناك خيار عدم تشفيره. OOB يقوم بترميز (في هذه الحالة "المسار") المعلمة قبل أن تطابق عنوان url مرة أخرى. فمثلا

// In SomeResourceName factory:
$resouce('/:path',  { path: 'default.json' }, ...)
// Useing SomeResourceName
SomeResourceName.get({ path: 'game/mygame.json' })

سيؤدي هذا إلى استدعاء عنوان url "/game٪2Fmygame.json" بدلاً من "/game/mygame.json".

هناك حل سريع للإصلاح:

// In angular-resource.js and method encodeUriSegment
  function encodeUriSegment(val) {
    return encodeUriQuery(val, true).
      replace(/%26/gi, '&').
      replace(/%3D/gi, '=').
      replace(/%2B/gi, '+'). 
      replace(/%2F/gi, '/'); // <--- Add this line
  }

ليس لدي أي فكرة عما سينكسر ، لكن كما تعلم ، فإنه يعمل بالنسبة لي. يمكن للمرء أيضًا اختطاف وسيطة الإجراءات في ResourceFactory وتمرير علامة تشفير تخطي إلى وسيطة افتراضات منشئ المسار لإخباره بتخطي التشفير.

Lots of comments ngResource moderate more info feature

التعليق الأكثر فائدة

@ ibrahim89 ، تأكد من استخدام نفس الإصدار من المصدر الزاوي والزاوي.

ال 55 كومينتر

تم إنشاء فكرة مع التغييرات الخاصة بالاختطاف :) https://gist.github.com/3749345

+1 لهذا. يوفر مرونة أكبر. في حالة الاستخدام الخاصة بنا ، نستخدم بقية البيانات الربيعية للواجهة الخلفية وطرق البحث هي معلمات مسار نحتاج إلى تعيينها للإجراءات ، من الناحية المثالية في نفس كائن المورد مثل عمليات CRUD الأساسية.

+1. تحتوي معرفاتنا على شرطات مائلة (نستخدم RavenDB) وسيكون حلًا نظيفًا إذا لم يكن مشفرًا

إن جعله اختياريًا أمر جيد ولكن يرجى التأكد من تمكينه افتراضيًا.

لا ينصح بعدم تشفير URIs. قد يبدو عدم القيام بذلك "نظيفًا" الآن ولكني أؤكد لك أنه سوف يعضك في المؤخرة في هذه الحياة أو التي تليها.

إذا قرأت http://www.ietf.org/rfc/rfc3986.txt بشكل صحيح ، فيجب أن يُسمح لنا باستخدام الشرطة المائلة غير المشفرة للجزء.

3.5 شظية

يسمح مكون معرف الجزء الخاص بـ URI بشكل غير مباشر
تحديد مورد ثانوي بالرجوع إلى مصدر أساسي
الموارد والمعلومات التعريفية الإضافية. المحدد
قد يكون المورد الثانوي جزءًا أو مجموعة فرعية من المورد الأساسي
الموارد ، بعض وجهات النظر حول تمثيلات المورد الأساسي ، أو
بعض الموارد الأخرى المحددة أو الموصوفة من خلال تلك التمثيلات. أ
يُشار إلى مكون معرف الجزء من خلال وجود ملف
علامة الرقم ("#") وتنتهي بنهاية URI.

 fragment    = *( pchar / "/" / "?" )

...
يُسمح باستخدام الشرطة المائلة ("/") وعلامة الاستفهام ("؟")
تمثل البيانات داخل معرف الجزء. احذر أن بعض
قد لا تتعامل عمليات التنفيذ الخاطئة القديمة مع هذه البيانات بشكل صحيح
عند استخدامه كعنوان URI أساسي للمراجع النسبية (Section
5.1).

حالة الاستخدام: $location.hash('/secondary-resource')

أشعر بالفضول فقط ، هل من الممكن تجنب هذه المشكلة عن طريق التشفير المزدوج لمعلماتك؟

آسف ، ثم يجعل الأمر أسوأ. فقط للتأكيد لقد جربت عددًا من عمليات الفتح على الرغم من أنها شعرت بأنها غير مجدية!

'/'، '٪ 252F' ->٪ 25252F

ايضا،

/٪ 2f ->٪ 252F
'/'، '//' ->٪ 2F٪ 2F

شكرا على الفكر. الطلب لا يزال قائما.

ركض في هذا اليوم. +1
قد لا يعجبني ذلك ، لكن هويتنا تحتوي على شُرط أيضًا. يجب أن يكون هذا اختياريًا.

+1

+1

+1

+1

+1

+1

أرى ذكرًا لقاعدة البيانات (RavenDB) التي تجعل التنفيذ الحالي إشكاليًا ، لكنني أتوقع أن يكون هناك خادم وسيط يتوقع المكونات المشفرة ، ويفك تشفيرها إلى المعرف الصحيح على الواجهة الخلفية. هل يمكن لشخص ما تقديم حالة استخدام أكثر واقعية حول المكان الذي يتسبب فيه التشفير الإجباري في حدوث مشكلات (آسف ليس لدي المزيد من السياق على RavenDB)؟

نتردد في السماح بذلك مع التصميم الحالي لمورد $ ، لأنه سيجعل من السهل على إدخال المستخدم التأثير على مسار الطلب.

أستخدم موقع $ لتصميم REST / الوسائط التشعبية وليس RavenDB (أو $ Resource). اضطررت للعمل مع نسخة مصححة من المكتبة.

أسعى أيضًا للحصول على تأكيد بأن هذا الاقتراح في الواقع يتبع في الواقع RFC أيضًا - انظر تعليقي أعلاه

قد أكون صدئًا بعض الشيء حول المكتبة - لذا أعتذر كثيرًا إذا كنت مخطئًا - هناك أيضًا تطبيقان لأحدهما في المورد في L332 والآخر في Angular في 1071 .

أنا فقط بحاجة إلى واحد في Angular لأنه ما يستخدمه $ location ؛-) (نعم ، أرى المشكلة هنا لذا لا أقترح عدم وجود تطبيقات مختلفة). أعتذر إذا كان لدي أي تحليل غير صحيح.

+1
هل لدى أي شخص حل بديل لإنشاء عناوين URL للمورد تحتوي على خطوط مائلة للأمام؟

وفقًا لخط التصحيح المذكور أعلاه في الملفات ، تم أيضًا ذكر التطبيقين أعلاه . انها الألم.

هل هناك أي حركة على هذا؟
فقط أضف نقطة يمكنني من خلالها استخدام مثل هذا الخيار بنفسي.

مرحبا،

لدي نفس المشكلة ولكن جوهرها لا يجعلها تعمل بالنسبة لي. أين يجب أن أضع طريقة encodeUirSegment أو أين يمكنني وضع هذا الخيار؟ : /

كنت أستخدم معترض HTTP لتحويل عناوين URL. كانت تعمل حتى اختبرت على IE11. الفواصل الزاوية لطلبات XHR لعناوين URL بما في ذلك % في IE11. لست متأكدا من IE10. من المفترض أن يدعم Angular IE9 + ( مرجع )

أعتقد أنني سأعود إلى مصدر ngResource المعدل ..

connorbode --- يا صاح ، كما ورد في مشكلتك ، اكتب حالة اختبار فاشلة =) يجب تغطية هذا المسار بالفعل ، لذلك هناك احتمالان ، إما أنه لم يتم تغطيته ويجب أن يكون كذلك ، أو أنك تفعل شيئًا لكسر هذه.

دعنا نكتشف ما هو!

+1

+1

+1

من المستحيل العمل مع CouchDB ووثائق التصميم (_design / cafehub / _view / menu_items)

هل يمكنكم إجراء 1+ على طلب السحب الخاص بي بدلاً من هذه المشكلة؟ يعمل على إصلاح المشكلة ولكن تم تجاهله بشكل عام منذ تقديمه. https://github.com/angular/angular.js/pull/7940

+1
أحتاج حقًا إلى هذا للتفاعل مع بعض خدمات الويب القديمة التي لا تؤدي فك شفرة عنوان URL

+1

هناك بالتأكيد ظروف مفيدة وقابلة للتطبيق حيث يرغب المستخدم في تعطيل تشفير معلمات URL (على سبيل المثال ، حيث تريد إلحاق مسار إلى أحد الموارد بعنوان URL الأساسي).

+1

+1

+1

+1

toddb فقط لمعلوماتك ، يشير اقتباس المواصفات الخاص بك إلى جزء جزء من عنوان URL ، أي الجزء #foo/bar ، حيث لا يكون الهروب من الشرطة المائلة مطلوبًا أو مناسبًا بالفعل. لكن هذا الخطأ يتعلق بالهروب من شرطة مائلة في جزء المسار الرئيسي من عنوان URL. بشكل عام ، لا أعتقد أن RFC ينطبق على هذا ، كيف تتعامل خدمة موارد Angular $ مع مطابقة الأنماط وإنشاء عنوان URL لا يهم RFC كثيرًا.

عدم تخطي الخطوط المائلة في معامل النمط :param العادي لديه مشكلة تجعل النمط غير قابل للعكس. على سبيل المثال ، إذا كان لديك /x/:param ، وتسمح بتوليد /x/y/z مقابل {param: 'y/z'} ، فإن الناتج /x/y/z سيفشل في التحليل مقابل نمط عنوان URL.

IMHO قد يكون من المنطقي أن يكون لديك ميزة في أنماط URL لقبول نمط نجمة يأكل خطوط مائلة ، على سبيل المثال "/:param1/:param2/*pathParam" ، حيث يأكل *pathParam شرطات مائلة في عنوان URL. بالنسبة إلى المعلمات * ، سيكون من المنطقي أيضًا قبول الشرطات المائلة دون الإفلات منها.

mprobst - أنت محق تمامًا في أنني كنت أسجل خطأ فقط حول الجزء. الكود كما أستخدمه _أيضا_ يؤثر على الجزء. أنا لا أستخدم خدمة $resource ولكن بدلاً من ذلك $location . إذا أسعفتني ذاكرتي ، فهناك عدة تطبيقات لكود uriSegment.

التصحيح من خلال connorbode من قراءة سريعة سيعالج المشكلة. هتافات

+1

+1

+1

+1

+1

+1

+1

+1

يمكنك استخدام نفس بناء الجملة كما هو الحال في ui-router lib:
http://angular-ui.github.io/ui-router/site/#/api/ui.router.util.type : UrlMatcher

+1

يحدث أيضًا في الموقع

: +1:

+1

أقوم حاليًا بفك تشفير لإرسال عنوان url الأصلي الخاص بي إلى الخلفية

.factory('decodeUriSegment', () => {
    return (url) => {
      return url.replace(/@/g, '%40')
        .replace(/:/g, '%3A')
        .replace(/\$/g, '%24')
        .replace(/,/g, '%2C')
        .replace(/\+/g, '%20');
    };
  });

+1

+1

app.config(function($resourceProvider) {
    $resourceProvider.defaults.stripTrailingSlashes = false;
});

https://github.com/angular/angular.js/pull/5560

+1

أتلقى هذا الخطأ في خدمة الموارد angularjs $
خطأ: إن encodeUriSegment ليس دالة

@ ibrahim89 ، تأكد من استخدام نفس الإصدار من المصدر الزاوي والزاوي.

gkalpak ، شكرا لك !!

تم حل خطأي

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

WesleyKapow picture WesleyKapow  ·  3تعليقات

kishanmundha picture kishanmundha  ·  3تعليقات

th0r picture th0r  ·  3تعليقات

jetta20162 picture jetta20162  ·  3تعليقات

brijesh1ec picture brijesh1ec  ·  3تعليقات