質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1148閲覧

Android(Kotlin)でHTTP POSTする時に勝手に改行が入る

yskst96

総合スコア12

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/06/27 19:05

前提・実現したいこと

ある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のヒアドキュメント記法("""で囲む)などでも試してみましたが
結果は同じでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

AAAAAAAAAAAAAAAAAAAAにダブルクォーテーション付けなくていいのかな?

【追記】

エラーメッセージのエスケープを外すと‥

"Invalid JSON payload received. Unexpected token. "image": {"content":AAAAAAAAAAAAAAAAAAAA ^"

何が悪いのか一目瞭然かと。

投稿2018/06/28 05:56

編集2018/06/28 06:17
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yskst96

2018/06/28 10:47

全然気づかなかった... 無事動きました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問