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

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

ただいまの
回答率

88.04%

APIに値をPOSTできません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,388

score 409

AndroidからAPIへJSONデータをPOSTしたいです。

通信はできているのですが、
AndroidからAPIへ値を渡すことができません。

①JavaからAPIへJSONデータを渡す
②APIで受け取ったJSONデータで検索をかける
③検索結果をAPIからJava側へ送る。

という流れを実装しようと考えています。

①でつまづいてしまいました。。。

Javaの方はOKHTTPを使用しています。

Android

/    // POST
    private void postTest() {
        MediaType MIMEType= MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(MIMEType, "地下一階");


        Request request = new Request.Builder()
                .url("https://town-sagae.c9users.io/api/v1/images/search")
                .post(body)
                .build();

        OkHttpClient client = new OkHttpClient();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                failMessage();
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                res = response.body().string();
                System.out.println("res");
                System.out.println(res); ①指定したURLのHTML要素が返ってきます。
                System.out.println("res");
                runOnUiThread(new Runnable() {
                    public void run() {
                        textViewRes.setText(res);
                        textViewDes.setText("No Data");
                    }
                });
            }
        });

    }

API

module Api
  module V1
    class ImagesController < ApplicationController
    skip_before_filter :verify_authenticity_token

      def index
        @images = Image.all
        render json: @images
      end

      def search ★ここです。
         json_request = JSON.parse(request.body.read)
         @images = Image.where(location: json_request)
         @images.destroy_all
      end

    end
  end
end

エラーは出ていないと思うのですが、ログはこのようになっています。
Java側です。

06-16 12:12:54.135 9456-9456/? I/art: Not late-enabling -Xcheck:jni (already on)
06-16 12:12:54.135 9456-9456/? W/art: Unexpected CPU variant for X86 using defaults: x86
06-16 12:12:54.564 9456-9456/station.around.aroundsatation W/System: ClassLoader referenced unknown path: /data/app/station.around.aroundsatation-1/lib/x86
06-16 12:12:54.574 9456-9456/station.around.aroundsatation I/InstantRun: starting instant run server: is main process
06-16 12:12:54.990 9456-9463/station.around.aroundsatation W/art: Suspending all threads took: 14.908ms
06-16 12:12:55.113 9456-9456/station.around.aroundsatation W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
06-16 12:12:55.465 9456-9456/station.around.aroundsatation D/debug: locationStart()
06-16 12:12:55.467 9456-9456/station.around.aroundsatation D/debug: gpsEnabled
06-16 12:12:55.596 9456-9495/station.around.aroundsatation I/OpenGLRenderer: Initialized EGL, version 1.4
06-16 12:12:55.596 9456-9495/station.around.aroundsatation D/OpenGLRenderer: Swap behavior 1
06-16 12:12:55.596 9456-9495/station.around.aroundsatation W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
06-16 12:12:55.596 9456-9495/station.around.aroundsatation D/OpenGLRenderer: Swap behavior 0
06-16 12:12:55.702 9456-9456/station.around.aroundsatation W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
06-16 12:12:56.907 9456-9456/station.around.aroundsatation D/NetworkSecurityConfig: No Network Security Config specified, using platform default

ご経験ある方、ご助言お願いします。

 追加

        RequestBody body = RequestBody.create(MIMEType, "{\"gps\":\"地下一階\"}");
      def search
         json_request = JSON.parse(request.body.read)
         @images = Image.where(location: json_request.gps)★変更★
         @images.destroy_all
         render json: @images
      end

ログ

06-16 13:55:23.119 346-346/? I/art: Not late-enabling -Xcheck:jni (already on)
06-16 13:55:23.119 346-346/? W/art: Unexpected CPU variant for X86 using defaults: x86
06-16 13:55:23.386 346-346/station.around.aroundsatation W/System: ClassLoader referenced unknown path: /data/app/station.around.aroundsatation-2/lib/x86
06-16 13:55:23.411 346-346/station.around.aroundsatation I/InstantRun: starting instant run server: is main process
06-16 13:55:23.909 346-346/station.around.aroundsatation W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
06-16 13:55:24.219 346-353/station.around.aroundsatation W/art: Suspending all threads took: 17.584ms
06-16 13:55:24.293 346-346/station.around.aroundsatation D/debug: locationStart()
06-16 13:55:24.294 346-346/station.around.aroundsatation D/debug: gpsEnabled
06-16 13:55:24.499 346-391/station.around.aroundsatation I/OpenGLRenderer: Initialized EGL, version 1.4
06-16 13:55:24.499 346-391/station.around.aroundsatation D/OpenGLRenderer: Swap behavior 1
06-16 13:55:24.500 346-391/station.around.aroundsatation W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
06-16 13:55:24.500 346-391/station.around.aroundsatation D/OpenGLRenderer: Swap behavior 0
06-16 13:55:24.559 346-346/station.around.aroundsatation W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
06-16 13:55:25.727 346-346/station.around.aroundsatation D/NetworkSecurityConfig: No Network Security Config specified, using platform default

API

module Api
  module V1
    class ImagesController < ApplicationController
    skip_before_filter :verify_authenticity_token

      def index
        @images = Image.all
        render json: @images
      end

      def search
         @images = Image.all
         @images.destroy_all
         render json: @images
      end

    end
  end
end
        System.out.println("request");
        Request request = new Request.Builder()
                .url("http://candii.tk/api/v1/images/search")       // HTTPアクセス POST送信 テスト確認用ページ
                .post(requestBody)
                .build();
        System.out.println("request");
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

AndroidからAPIへJSONデータをPOSTしたいです。

まずはJSON形式でリクエスト内容を設定してはどうでしょう?

RequestBody body = RequestBody.create(MIMEType, "地下一階");

「地下一階」という文字列は明らかにJSON形式じゃないですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/16 17:24

    一応確認ですが、提示されているソース内のメソッド「postTest()」は実行されていますか?
    処理開始付近やRequest送信前あたりにSystem.out.printl()でメッセージ出力してみてください。

    キャンセル

  • 2017/06/16 18:32

    ありがとうございます!
    追加でSystem.out.printlnを実行しました。
    きちんと動いているようです。。。

    キャンセル

  • 2017/06/16 19:44

    解決できました!
    ありがとうございます!

    キャンセル

+1

本番環境(http://)のログをチェックしたところ、
以下のようなメッセージがありました。

ActionController::RoutingError (No route matches [POST] "/api/v1/images/search"):

androidがpostなので、APIもpostでなければいけないところをgetにしていたのが原因のようです。
ルーティングを修正して無事実装できました。

bofore

      get 'images/search'

after

      post 'images/search'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る