前提・実現したいこと
あるWebAPIに対して、HttpURLConnectionを使ってjson文字列をPOSTしたい。
発生している問題・エラーメッセージ
POSTされているjson文字列に改行(とタブ)が含まれており、400エラーが返ってくる。
エラー内容を見るにjson文字列が勝手に整形されているようなのですが、
自分ではそのような処理を入れておらずなぜ整形されているのかわからず困っています...。
下記のjson文字列に対し改行をブランクに置換したあとPOSTしています。
json
1"requests": [ 2 { 3 "image": { 4 "content": "AAAAAAAAAAAAAAAAAAAAAAAAAAAA" 5 }, 6 "features": [ 7 { 8 "type": "hoge" 9 } 10 ] 11 } 12 ] 13 }
エラーメッセージ:
"Invalid JSON payload received. Unexpected token.\n"image": {"content":AAAAAAAAAAAAAAAAAAAA\n ^"
該当のソースコード
kotlin
1class MainActivity : AppCompatActivity() { 2 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState) 5 setContentView(R.layout.activity_main) 6 7 var data: String = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" 8 9 val header: HashMap<String, String> = hashMapOf("Content-Type" to "application/json") 10 11 val body ="{\"requests\": [{\"image\": {\"content\":" +data.replace("\n","")+ " },\"features\": [{\"type\": \"hoge\" }] }] }" 12 13 Log.d("applog", body) 14 15 HttpTask({ 16 17 Log.d("applog", it) 18 19 }).execute("POST", "https://<ENDPOINT>",body) 20 } 21 22 private fun convert(bitmap: Bitmap): String { 23 val outputStream = ByteArrayOutputStream() 24 bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) 25 26 return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT) 27 } 28} 29 30 31class HttpTask(callback: (String?) -> Unit) : AsyncTask<String, Unit, String>() { 32 33 var callback = callback 34 35 override fun doInBackground(vararg params: String): String? { 36 val url = URL(params[1]) 37 val httpClient = url.openConnection() as HttpURLConnection 38 httpClient.setReadTimeout(3000) 39 httpClient.setConnectTimeout(3000) 40 httpClient.requestMethod = params[0] 41 42 if (params[0] == "POST") { 43 httpClient.instanceFollowRedirects = false 44 httpClient.doOutput = true 45 httpClient.doInput = true 46 httpClient.useCaches = false 47 httpClient.setRequestProperty("Content-Type", "application/json; charset=utf-8") 48 } 49 try { 50 if (params[0] == "POST") { 51 httpClient.connect() 52 val os = httpClient.getOutputStream() 53 val writer = BufferedWriter(OutputStreamWriter(os, "UTF-8")) 54 Log.d("applog",params[2]) 55 writer.write(params[2].replace("\n","").replace("\t","")) 56 writer.flush() 57 writer.close() 58 os.close() 59 } 60 if (httpClient.responseCode == HttpURLConnection.HTTP_OK) { 61 val stream = BufferedInputStream(httpClient.inputStream) 62 val data: String = readStream(inputStream = stream) 63 return data 64 } else { 65 Log.d("applog","ERROR ${httpClient.responseCode}") 66 67 val stream = BufferedInputStream(httpClient.errorStream) 68 val data: String = readStream(inputStream = stream) 69 Log.d("applog","ERROR ${data}") 70 71 72 } 73 } catch (e: Exception) { 74 e.printStackTrace() 75 } finally { 76 httpClient.disconnect() 77 } 78 79 return null 80 } 81 82 private fun readStream(inputStream: BufferedInputStream): String { 83 val bufferedReader = BufferedReader(InputStreamReader(inputStream)) 84 val stringBuilder = StringBuilder() 85 bufferedReader.forEachLine { stringBuilder.append(it) } 86 return stringBuilder.toString() 87 } 88 89 override fun onPostExecute(result: String?) { 90 super.equals(result) 91 Log.d("applog",result) 92 callback(result) 93 94 } 95} 96
試したこと
各所で改行文字をブランクに置換する処理を入れているのですがなぜか
レスポンスで改行が含まれると怒られてしまい途方に暮れています。
json文字列の定義はkotlinのヒアドキュメント記法("""で囲む)などでも試してみましたが
結果は同じでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/28 10:47