Dart Documentationurl_patternUrlPattern

UrlPattern class

URL template with placeholders that can be filled in to produce a URL.

class UrlPattern {
 final List<_UrlPatternToken> _tokens;

 /**
  * Creates a UrlPattern from the specification [:pattern:].
  * See http://tools.ietf.org/html/draft-gregorio-uritemplate-07
  * We only implement a very simple subset for now.
  */
 UrlPattern(String pattern) : _tokens = [] {
   var cursor = 0;
   while (cursor < pattern.length) {
     final open = pattern.indexOf("{", cursor);
     if (open < 0) {
       final rest = pattern.substring(cursor);
       _tokens.add((params) => rest);
       cursor = pattern.length;
     } else {
       if (open > cursor) {
         final intermediate = pattern.substring(cursor, open);
         _tokens.add((params) => intermediate);
       }
       final close = pattern.indexOf("}", open);
       if (close < 0) throw new ArgumentError("Token meets end of text: $pattern");
       String variable = pattern.substring(open + 1, close);
       _tokens.add((params) => (params[variable] == null)
           ? 'null'
           : Uri.encodeComponent(params[variable].toString()));
       cursor = close + 1;
     }
   }
 }

 /** Generate a URL with the specified list of URL and query parameters. */
 String generate(Map<String, Object> urlParams, Map<String, Object> queryParams) {
   final buffer = new StringBuffer();
   _tokens.forEach((token) => buffer.write(token(urlParams)));
   var first = true;
   queryParams.forEach((key, value) {
     if (value == null) return;
     if (value is List) {
       value.forEach((listValue) {
         buffer.write(first ? '?' : '&');
         if (first) first = false;
         buffer.write(Uri.encodeComponent(key.toString()));
         buffer.write('=');
         buffer.write(Uri.encodeComponent(listValue.toString()));
       });
     } else {
       buffer.write(first ? '?' : '&');
       if (first) first = false;
       buffer.write(Uri.encodeComponent(key.toString()));
       buffer.write('=');
       buffer.write(Uri.encodeComponent(value.toString()));
     }
   });
   return buffer.toString();
 }

 static String generatePattern(String pattern, Map<String, Object> urlParams,
                               Map<String, Object> queryParams) {
   var urlPattern = new UrlPattern(pattern);
   return urlPattern.generate(urlParams, queryParams);
 }
}

Static Methods

String generatePattern(String pattern, Map<String, Object> urlParams, Map<String, Object> queryParams) #

static String generatePattern(String pattern, Map<String, Object> urlParams,
                             Map<String, Object> queryParams) {
 var urlPattern = new UrlPattern(pattern);
 return urlPattern.generate(urlParams, queryParams);
}

Constructors

new UrlPattern(String pattern) #

Creates a UrlPattern from the specification pattern. See http://tools.ietf.org/html/draft-gregorio-uritemplate-07 We only implement a very simple subset for now.

UrlPattern(String pattern) : _tokens = [] {
 var cursor = 0;
 while (cursor < pattern.length) {
   final open = pattern.indexOf("{", cursor);
   if (open < 0) {
     final rest = pattern.substring(cursor);
     _tokens.add((params) => rest);
     cursor = pattern.length;
   } else {
     if (open > cursor) {
       final intermediate = pattern.substring(cursor, open);
       _tokens.add((params) => intermediate);
     }
     final close = pattern.indexOf("}", open);
     if (close < 0) throw new ArgumentError("Token meets end of text: $pattern");
     String variable = pattern.substring(open + 1, close);
     _tokens.add((params) => (params[variable] == null)
         ? 'null'
         : Uri.encodeComponent(params[variable].toString()));
     cursor = close + 1;
   }
 }
}

Methods

String generate(Map<String, Object> urlParams, Map<String, Object> queryParams) #

Generate a URL with the specified list of URL and query parameters.

String generate(Map<String, Object> urlParams, Map<String, Object> queryParams) {
 final buffer = new StringBuffer();
 _tokens.forEach((token) => buffer.write(token(urlParams)));
 var first = true;
 queryParams.forEach((key, value) {
   if (value == null) return;
   if (value is List) {
     value.forEach((listValue) {
       buffer.write(first ? '?' : '&');
       if (first) first = false;
       buffer.write(Uri.encodeComponent(key.toString()));
       buffer.write('=');
       buffer.write(Uri.encodeComponent(listValue.toString()));
     });
   } else {
     buffer.write(first ? '?' : '&');
     if (first) first = false;
     buffer.write(Uri.encodeComponent(key.toString()));
     buffer.write('=');
     buffer.write(Uri.encodeComponent(value.toString()));
   }
 });
 return buffer.toString();
}