2014-07-02 15 views
6

Standart javascript işlevi encodeURIComponent kullanarak sorgu dizesi parametrelerini kodlamak için AngularJS bekleniyordu. şu teste göre bu durum böyle değildir: Test aşağıdaki hata nedeniyle başarısızAngularjs uri bileşenleri nasıl kodlanır

describe('$http', function() { 
it('encodes uri components correctly', inject(function($http, $httpBackend) { 
    var data = 'Hello from http://example.com'; 
    $httpBackend.expectGET('/api/process?data=' + encodeURIComponent(data)); 
    $http({ method: 'GET', url: '/api/process', params: { data: data } }); 
    $httpBackend.flush(); 
})); 
}); 

:

$http encodes uri components correctly
Error: Unexpected request: GET /api/process?data=Hello+from+http:%2F%2Fexample.com
Expected GET /api/process?data=Hello%20from%20http%3A%2F%2Fexample.com

Özetle:

  • Beklenen kodlama: Hello%20from%20http%3A%2F%2Fexample.com
  • Gerçek kodlama: Hello+from+http:%2F%2Fexample.com

AngularJS ile hangi uri bileşeni (aka query string parametreleri) kodlama yöntemini beklemeliyim?

cevap

4

Açısal (en azından 1.3) sadece kullanmaz encodeURIComponent burada açıklanan çeşitli başka seçenekler de vardır ve ("için "+"" gibi) bazı değiştirmeler değiştirir.

bu

neden açıklayan taahhüt: https://github.com/angular/angular.js/commit/9e30baad3feafc82fb2f2011fd3f21909f4ba29e

Ve burada 1.3 kaynaklarda görebilirsiniz ne: pctEncodeSpacestrue için kodlanmış olup

/** 
* This method is intended for encoding *key* or *value* parts of query component. We need a custom 
* method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be 
* encoded per http://tools.ietf.org/html/rfc3986: 
* query  = *(pchar/"/"/"?") 
* pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
* unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
* pct-encoded = "%" HEXDIG HEXDIG 
* sub-delims = "!"/"$"/"&"/"'"/"("/")" 
*     /"*"/"+"/","/";"/"=" 
*/ 
function encodeUriQuery(val, pctEncodeSpaces) { 
    return encodeURIComponent(val). 
      replace(/%40/gi, '@'). 
      replace(/%3A/gi, ':'). 
      replace(/%24/g, '$'). 
      replace(/%2C/gi, ','). 
      replace(/%3B/gi, ';'). 
      replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); 
} 

not olduğunu;

Burada URI yanlış aynı şekilde kodlama benim düşünceme angularjs ise

decodeURIComponent(val. 
      replace('@', '%40'). 
      replace(':', '%3A'). 
      replace('$', '%24'). 
      replace(',', '%2C'). 
      replace(';', '%3B'). 
      replace('+', '%20')); 
+0

Bir şekilde angular.encodeUriQuery gibi bir şeye erişebilir miyiz? –

-3

Ön kodlama parametrelerini geçerken görünür. URL'yi kodlarsınız, ancak kodlanmamış bir URL'yi JSON veri parametresi üzerinden geçirdikten sonra. Belki de kodunuzdaki bu değişiklik işe yarayacaktır.

describe('$http', function() { 
it('encodes uri components correctly', inject(function($http, $httpBackend) { 
    var data = encodeURIComponent('Hello from http://example.com'); 
    $httpBackend.expectGET('/api/process?data=' + encodeURIComponent(data)); 
    $http({ method: 'GET', url: '/api/process', params: { data: data } }); 
    $httpBackend.flush(); 
})); 
}); 

Ayrıca, yalnızca URL kodlama parçasını alıp turp içine koyduktan sonra: Bu doğru çalışıyor gibi görünüyor http://jsfiddle.net/eNtgL/1/

, kendi URL ile soruna neden dış faktörleri araştırmak isteyebilir. Orada bu

Encode URL in JavaScript?

+1

Merhaba - Ben angularjs benim için bunu yapmak için (burada kullanıyorum js framework) bekliyorum çünkü parametre ön kodlama geçirerek. Ve öyle. Ama bir şekilde bunu beklemiyorum. 'EncodeURIComponent' işlevi üzerinden kodlama yapmaz. Benim sorum AngularJS özgüdür. – nakhli

+0

Lütfen yukarıdaki koduma göre kodlama yapmayı deneyin. Bu çizgide aşağıdaki değişikliği yapın. var data = encodeURIComponent ('http://example.com' dan Merhaba); –

+1

Sunucu iletişimi çerçevesine aktardığım verileri kendim kodlayamıyorum. Belgelere göre, '$ http' işlevi şeffaf bir şekilde yapmalıdır. Ve aslında bunu düzeltiyor. Benim sorunum, esas olarak benim soruya dahil ettiğim yasemin testinde olduğu gibi test etmektir. Kodumda ön kodlama kabul edilemez. – nakhli

4

parametreleri çözmek için yapabilecekleriniz URL yolu segmentleri VE URI sorgu parametreleri. Benim için bu bir hatadır ve aslında onu düzeltmek için bir pull request yayınladım.

Çekme isteğinde tanıttığım test aslında bu hatayı doğrular (hem AngularJS 1.3.* hem de geçerli master ile test edilmiştir).