hazychill
4/7/2013 - 9:22 AM

creates text data suitable for application/x-www-form-urlencoded

creates text data suitable for application/x-www-form-urlencoded

// Usage: 
//   var query = ConstructQueryData(
//     "param1", "value1",
//     "param2", "value2",
//     "param3", "value=with#escape");
//   -> query: "param1=value1&param2=value2&param3=value%3Dwith%23escape"
public static string ConstructQueryData(params string[] keyValArray) {
  if (keyValArray == null) {
    return string.Empty;
  }

  int itemCount;
  if (keyValArray.Length % 2 == 0) {
    itemCount = keyValArray.Length / 2;
  }
  else {
    itemCount = (keyValArray.Length + 1) / 2;
  }

  var escapedKeyValArray = new string[itemCount];

  for (var i = 0; i < keyValArray.Length; i += 2) {
    var rawKey = keyValArray[i] ?? string.Empty;
    string rawVal;
    if (i + 1 < keyValArray.Length) {
      rawVal = keyValArray[i + 1] ?? string.Empty;
    }
    else {
      rawVal = string.Empty;
    }

    var key = Uri.EscapeDataString(rawKey);
    var val = Uri.EscapeDataString(rawVal);
    escapedKeyValArray[i / 2] = string.Format("{0}={1}", key, val);
  }

  return string.Join("&", escapedKeyValArray);
}