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

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

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

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

Java

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

Android

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

4488閲覧

OKHTTPでAPIに値をPOSTしたいです。

s.k

総合スコア423

JSON

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

Java

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

Android

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/06/14 10:38

編集2017/06/14 10:41

###前提・実現したいこと
AndroidアプリをHTTP通信でAPIにPOSTし、検索結果を取得したいです。
APIのPOSTメソッドをコントロールできず、さらにはAndroid側で取得情報を処理できずにつまづきました。

  1. Androidアプリに検索文字列を入力
  2. 1の入力データをAPIにPOST
  3. 1をAPI側で受け取り、データベースを検索し、結果をJSONに格納
  4. 3の情報をAndroid側で取得

まず、第一段階として、Android側から値をAPIにPOSTすることからクリアしようと考えてます。
そこで、AndroidでPOSTの処理、APIにPOSTされた値を受け取り、保存する処理を書きました。

  • OKHTTPで通信処理を書いています。
  • APIはRailsで製作してます。
  • AndroidはJavaで書いています。

###発生している問題・エラーメッセージ

どうもAndroid側から、
値をAPIに送れません。

Android側のレスポンスの内容です。

System.out: {"status":422,"error":"Unprocessable Entity"}

###該当のソースコード

  • Android:POST処理

gpsキーで、"地下一階"の値を渡す処理を書きました。

Java

1 // POST 2 private void postTest() { 3 RequestBody formBody = new FormBody.Builder() 4 .add("gps", "地下一階") 5 .build(); 6 7 Request request = new Request.Builder() 8 .url("http://candii.tk/api/v1/images/search/") 9 .post(formBody) 10 .build(); 11 12 OkHttpClient client = new OkHttpClient(); 13 client.newCall(request).enqueue(new Callback() { 14 @Override 15 public void onFailure(Call call, IOException e) { 16 failMessage(); 17 e.printStackTrace(); 18 } 19 20 @Override 21 public void onResponse(Call call, Response response) throws IOException { 22 res = response.body().string(); 23 System.out.println("res"); 24 System.out.println(res); ①上記のエラーを吐き出した部分です。 25 System.out.println("res"); 26 runOnUiThread(new Runnable() { 27 public void run() { 28 ListImage userEntity = gson.fromJson(res, ListImage.class); 29 System.out.println("userEntity"); 30 System.out.println(userEntity); 31 System.out.println("userEntity"); 32 textViewRes.setText("d"); 33 textViewDes.setText("No Data"); 34 } 35 }); 36 } 37 }); 38 }
  • API:POSTされた値を受けとります。

@imageデータは保存されていませんでした。

Ruby

1module Api 2 module V1 3 class ImagesController < ApplicationController 4 5 def index 6 @images = Image.all 7 render json: @images 8 end 9 10 def search 11 12 @image = Image.new(image_params) 13 @image.loation = params[:gps]POSTされた情報を受け取ります。 14 @image.save! 15 16 end 17 18 private 19 20 def image_params 21 params.require(:image).permit(:en_title, :ja_title, :en_content, :ja_content, :url, :location) 22 end 23 24 end 25 end 26end

API:ルーティング

ruby

1Rails.application.routes.draw do 2 3 root 'images#index' 4 5 namespace :api, { format: 'json' } do 6 namespace :v1, { format: 'json' } do 7 post 'images/search' 8 9 resources :images, :only => [:index] 10 resources :movies 11 end 12 end 13 14 resources :images 15 resources :movies 16 17 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 18end

だいぶ疑問のあるコードだとは思うんですが、
なぜ、API側で@imageが保存されていないのかご指摘いただければと思います。

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

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

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

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

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

guest

回答1

0

自己解決

Requestbodyクラスを変更しました。

before

RequestBody formBody = new FormBody.Builder() .add("gps", "地下一階") .build();

after

RequestBody requestBody = RequestBody.create( MediaType.parse("text/plain"), "地下一階" );

投稿2017/06/16 10:50

s.k

総合スコア423

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問