I use Okhttp 3.11 from android clients when making requests to the server. My parameter list and file name can contain Turkish characters, etc: ö,ı,ğ..
I use FormBody.Builder in requests where I send a parameter list. No problem here, like this:
val formBody = FormBody.Builder(Charset.forName("UTF-8"))
var encodedKey = URLEncoder.encode(map.key, "ISO-8859-9")
var encodedValue = URLEncoder.encode(map.value, "ISO-8859-9")
formBody.addEncoded(encodedKey, encodedValue)
I want to do the same when I send both parameters and files. But I couldn't figure out how to give it to MultipartBody.Builder. Anyone have an idea? Thank u so much.
val multiPartBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
parameterList.forEach
{
map ->
var encodedKey = URLEncoder.encode(map.key, "ISO-8859-9")
var encodedValue = URLEncoder.encode(map.value, "ISO-8859-9")
multiPartBuilder.addFormDataPart(encodedKey, encodedValue)
}
val fileMapIt: Iterator<Map.Entry<String?, File?>> = filesMap!!.entries.iterator()
while (fileMapIt.hasNext()) {
val currentFile = fileMapIt.next()
if (currentFile.key != null && currentFile.value != null) {
try {
val encodedKey = URLEncoder.encode(currentFile.key, "ISO-8859-9")
val encodedFileName = URLEncoder.encode(currentFile.value!!.name, "ISO-8859-9")
multiPartBuilder.addFormDataPart(encodedKey, encodedFileName, RequestBody.create(getMediaType(currentFile.value!!.toURI()), currentFile.value!!))
} catch (ex: Exception) {
}
}
}
var requestBody = multiPartBuilder.build()
var req = Request.Builder()
.url("xxx")
.post(requestBody)
private fun getMediaType(uriPrm: URI): okhttp3.MediaType? {
val uri = Uri.parse(uriPrm.toString())
val encodedUri = URLEncoder.encode(uri.toString())
val fileExtension = MimeTypeMap.getFileExtensionFromUrl(encodedUri)
var mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
fileExtension.toLowerCase())
return okhttp3.MediaType.parse(mimeType!!)
}