docs: def encode_params(self, data=None, **kwargs):
          """
          Build the body for a text/plain request.
          Will successfully encode parameters when passed as a dict or a list of
          2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
          if parameters are supplied as a dict.
          """
          charset = kwargs.get("charset", self.charset)
          collection_format = kwargs.get("collection_format", self.collection_format)
          output_str = kwargs.get("output_str", self.output_str)
  
          if data is None:
              return "", self.get_content_type(charset)
          elif isinstance(data, (str, bytes)):
              return data, self.get_content_type(charset)
          elif hasattr(data, 'read'):
              return data, self.get_content_type(charset)
          elif collection_format == 'multi' and hasattr(data, '__iter__'):
              result = []
              for k, vs in to_key_val_list(data):
                  if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
                      vs = [vs]
                  for v in vs:
                      result.append(b"=".join([self._encode(k, charset), self._encode(v, charset, output_str)]))
              return b'\n'.join(result), self.get_content_type(charset)
          elif collection_format == 'plain' and hasattr(data, '__iter__'):
              results = []
              for k, vs in to_key_val_dict(data).items():
                  results.append(b"=".join([self._encode(k, charset), self._encode(vs, charset, output_str)]))
  
              return b'\n'.join(results), self.get_content_type(charset)
          elif hasattr(data, '__iter__'):
              results = []
              for k, vs in to_key_val_dict(data).items():
                  if isinstance(vs, list):
                      v = self.COLLECTION_SEPARATORS[collection_format].join(e for e in vs)
                      key = k + '[]'
                  else:
                      v = vs
                      key = k
                  results.append(b"=".join([self._encode(key, charset), self._encode(v, charset, output_str)]))
  
              return b"\n".join(results), self.get_content_type(charset)
          else:
              return str(data).encode(charset) if charset else str(data), self.get_content_type(charset)