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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

4908閲覧

Kotlin: POSTリクエストを行ったがエラーが起きてクラッシュしてしまう

Haruto513

総合スコア52

JSON

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/03/27 05:59

JSONを送信してから結果のJSONを受け取るという処理をKotlinで書いています。
APIの方には特に問題がないはずなのですが、エラーを返され、アプリがクラッシュしてしまいます。
POSTの書き方が間違っているのか、それともAPIの方に問題があることを疑ったほうがいいのか、アドバイスをくださるとうれしいです。

以下のようにPOSTリクエストの処理を書いています。

kotlin

1fun request() { 2 val map: MutableMap<String,Any> = mutableMapOf("data1" to "example", "data2" to 0) 3 val jsonStr = Gson().toJson(map) 4 5 Thread { 6 val url = "http://xxxxxxxxxxxxxx.json" 7 response = HttpConnection().post(url,jsonStr) 8 }.start() 9} 10 11public class HttpConnection { 12 13 14 fun post(uri: String, json: String): String { 15 var buffer = "" 16 var con: HttpURLConnection? = null 17 val url = URL(uri) 18 try { 19 con = url.openConnection() as HttpURLConnection 20 con.requestMethod = "POST" 21 con.instanceFollowRedirects = false 22 con.setRequestProperty("Accept", "application/json") 23 con.doOutput = true 24 con.setRequestProperty("Content-Type", "application/json; charset=utf-8") 25 val os = con.outputStream 26 val ps = PrintStream(os) 27 ps.print(json) 28 ps.close() 29 30 val reader = BufferedReader(InputStreamReader(con.inputStream, "UTF-8")) 31 var line = reader.readLine() 32 while (line != null) { 33 buffer += line 34 line = reader.readLine() 35 } 36 reader.close() 37 }catch (e: java.lang.Exception){ 38 Log.e("エラーが起きました",e.toString()) 39 } 40 con?.disconnect() 41 return buffer 42 } 43}

また上記のpost()の箇所は、以下のように書いていたものを修正したものです。どちらも同様のエラーが出ています。

kotlin

1 fun post(url: String, json: String) : String { 2 var responce = "" 3 val con = URL(url).openConnection() as HttpURLConnection 4 con.requestMethod = "POST" 5 con.doInput = true 6 con.doOutput = true 7 con.setRequestProperty("Content-Type", "application/json") 8 con.setRequestProperty("Accept", "application/json") 9 con.instanceFollowRedirects = false 10 var resReader: BufferedReader? = null 11 try { 12 val os = con.outputStream 13 val ps = PrintStream(os) 14 ps.print(json) 15 ps.close() 16 resReader = BufferedReader(InputStreamReader(con.inputStream)) 17 con.connect() 18 con.responseCode 19 var line = resReader.readLine() 20 while (line != null){ 21 responce += line 22 line = resReader.readLine() 23 } 24 }catch (e: Exception) { 25 Log.e("エラーが起きました",e.toString()) 26 }finally { 27 con.disconnect() 28 resReader?.close() 29 } 30 return responce 31 }

そして発生したエラーが以下のようなものです。

logcat

1 2E/エラーが起きました: java.io.FileNotFoundException: http://xxxxxxxxxxxxxx.json 3D/AndroidRuntime: Shutting down VM 4E/AndroidRuntime: FATAL EXCEPTION: main 5 Process: jp.co.xxxxxxx.xxxxxx, PID: 9508 6 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 7 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503) 8 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 9 Caused by: java.lang.reflect.InvocationTargetException 10 at java.lang.reflect.Method.invoke(Native Method) 11 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 12 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)  13 Caused by: org.json.JSONException: End of input at character 0 of 14 15

かなりの間このエラーに手を焼いております。ヒントになるような知見をどなたかお持ちでしたら、ご教示頂けると幸いです。宜しくお願い致します。

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

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

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

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

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

nakasho_dev

2020/03/27 06:25

提示されているスタックトレースではコードがどこにあるかも分からないので、とりあえずコメントです。 FileNotFoundExceptionが「http://xxxxxxxxxxxxxx.json」対して起こっているのが良く分からないのですが、リクエストでローカルファイルを取得する際に発生しているExceptionでしょうか?httpということはローカルファイルではなさそうですよね。
nakasho_dev

2020/03/27 06:26

また、こういった処理はRetrofitを使うと良いように思えます。
Haruto513

2020/03/27 07:18

繋いでいるのは社内のネットワークだと思います。 Retrofitの方はこれから調べて実際に書いてみます!
nakasho_dev

2020/03/27 13:24

私の理解ではFileNotFoundExceptionはローカルファイルの取得に失敗していると思うのですが、指定しているのがそもそもローカルではなくリモートサーバのURLなのでしょうか?
guest

回答1

0

自己解決

調べたところ、APIの側の方に問題があったことが分かりました。
コードそのまま、APIの方を修正したところ、無事に動作しました。
アドバイスをくださった方、ありがとうございました。

投稿2020/04/02 04:46

Haruto513

総合スコア52

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問