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

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

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

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

Java

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

API

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

Q&A

解決済

4回答

3406閲覧

ios側からNSURLSession,NSMutableURLRequestを使って送られてくるjson形式のデータをphpを使って取得したい。

settyan

総合スコア60

JSON

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

Java

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

API

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

0グッド

0クリップ

投稿2016/06/15 04:44

編集2016/06/20 01:27

###ios側からNSULssesionで送られてくるjson形式のデータをphpを使って取得がしたい。
phpで処理しているのは見かけるんですがjavaでできるのかな?と

下記のソースコードでjsonを取得しようとしているのですが、おそらくios側でキーを設定していないために取得ができません。

キーの設定はどうすればよいのでしょうか?
キーは設定できないのでしょうか?

説明不足でしたので補足いたします-2016/06/16
具体的に以下のios(Objective-c)とphp,javaのソースコードで実行しています。

進展としまして、php,javaともにios側に固定値を返すことができたのでURLが間違っている事やサーバー側の問題とは考えにくい状況なのです。(初心者なので絶対とは言い切れませんが...)

それとgoogleのアプリ(?)のpostmanを使用すると、php,javaともにきれいに値が取れます。

###もうjavaはあきらめてphpにします。
そこでphpのほうでもう一度質問させていただきます。
phpの詳しいソースも掲載いたしました。
よろしくお願いします

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

なぜjsonの値が取れないのか検討が付かない状況です。 先輩方はコレと同じ状況で取得ができているため、前例はあるといっています。

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

------ios------- NSArray *lData = @[@{@"loginID":@"yamada",@"password":@"hello"}]; NSData *data = [NSJSONSerialization dataWithJSONObject:lData options:NSJSONWritingPrettyPrinted error:nil]; NSString *urlstr = [NSString stringWithFormat:@"接続先URL"]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setHTTPMethod:@"POST"]; [request setURL:[NSURL URLWithString:urlstr]]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; [request setTimeoutInterval:2.0]; [request setHTTPShouldHandleCookies:false]; [request setHTTPBody:data]; NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request]; [task resume]; ------php------- ①<?php header("Content-Type:applicasion/json"); $json = file_get_contents('php://input'); if(!empty($json)){ $jsonA = json_decode($json); echo json_encode($jsonA); exit(); }else{ $rArray = array("hoge" =>"hage2" , "hoge" =>"hage"); echo json_encode($rArray); exit(); } ?> ②<?php header("Content-Type:applicasion/json"); $json = file_get_contents('php://input'); echo json_decode($json); echo json_encode($json); exit(); } ?> ③<?php header("Content-Type:applicasion/json"); $json = file_get_contents('php://input'); $logID = $_POST['loginID']; $pass = $_POST['password']; $rArray = array("loginID" => $logID , "password" => $pass); echo json_encode($rArray); exit(); } ?> ###試したこと なのでphpに乗り換えて試していたのですがやはりうまくいきませんでした。 php://inputの周りが把握仕切れていません。 何か用意するファイルなどはあるのでしょうか? ###補足情報(言語/FW/ツール等のバージョンなど) Apach2.4(php) , ios,xcode ,php5 phpの場所ですが、同一PCではなく別PCにApach2.4を立ててその上において参照をしています。 叩き方は[例:)http://255.255.255.255/input2.php]のように叩いています。 PHPのversionは5です。 ###php側での挙動 ①のソースで行うと { "hoge" : "hage" } が帰ってきます。 ②のソースで行うとnullが帰ってきます。 ③のソースで行うとnullが帰ってきます。 取得したい値は { "loginID" : "yamada", "password" : "hallo" } です。 今はPHP側でiosから送られてきたデータをそのまま返す形にしています。 ###うまくいかなかった理由 クエリ文字に変換してNSDataに格納し送ってみたもののnullが返ってきました。 それとちがっていたら申し訳ないんですがURLの後ろに値が付くものってGETでの送信ではないのでしょうか? POSTは内部的にデータが送られるものと認識していたのですが... ###postmanでの挙動 [![](d60cfb68853f4d65c257635037503bbb.png) ###ios側の実行環境 Xcodeでのiosシュミレータはiphone6のios8以降 実機はiphone5sのios7.0でした。 ###urlの実行結果 Time: Sun, 19 Jun 16 18:05:25 -0700 Source ip: Headers (Some may be inserted by server) REQUEST_URI = /post.php QUERY_STRING = REQUEST_METHOD = POST GATEWAY_INTERFACE = REMOTE_PORT = REMOTE_ADDR = CONTENT_LENGTH = 62 HTTP_ACCEPT_ENCODING = gzip, deflate HTTP_ACCEPT_LANGUAGE = HTTP_USER_AGENT = HTTP_ACCEPT = application/json HTTP_CONNECTION = close CONTENT_TYPE = application/json HTTP_HOST = UNIQUE_ID = REQUEST_TIME_FLOAT = 1466384725.1898 REQUEST_TIME = 1466384725 No Post Params. == Begin post body == [ { "loginID" : "yamada", "password" : "hello" } ] == End post body == Upload contains PUT data: [ { "loginID" : "yamada", "password" : "hello" } ] ###上記URLの返信を受けてやったこと。 allow_url_fopen = on <-もともとなっていました。 <?php header("Content-Type:applicasion/json"); $url = "php://input"; // 対象のURL $ch = curl_init(); // 初期化 curl_setopt( $ch, CURLOPT_URL, $url ); // URLの設定 curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // 出力内容を受け取る設定 $json = curl_exec( $ch ); // データの取得 curl_close($ch); // cURLのクローズ 以下①のphp文 ?> <-今から試してみます。

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

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

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

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

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

masaya_ohashi

2016/06/17 06:53

うまくいかなかったというのはどういう動作をしたか具体的に記載していただけますか?PHP側でNOT GET VARになったのか、届いてはいるが想定している形ではないのか
settyan

2016/06/17 07:13 編集

ちなみにios側のdataの中身は改行を除けばmasaya_ohashiさんが予想していた通りのものを送っていました。
masaya_ohashi

2016/06/17 07:30

確認ですが、PHPはapacheのhtdocsフォルダに直に置かれたものへアクセスしていますか?
masaya_ohashi

2016/06/17 07:41

「それとgoogleのアプリ(?)のpostmanを使用すると、php,javaともにきれいに値が取れます。」 この一文ですが、ChromeのPostmanを使ってのテストですよね? 今のソース①や②に、Postmanを使って「{"loginID":"yamada","password":"hello"}」というjsonを送るとどう返ってきますか?
settyan

2016/06/17 08:02

PHPについてはhtdocsをちゃんと参照しています。 postmanについては質問部分に貼り付けました。
masaya_ohashi

2016/06/17 08:05

ちょっと気付くの遅れましたが、 「それとちがっていたら申し訳ないんですがURLの後ろに値が付くものってGETでの送信ではないのでしょうか? POSTは内部的にデータが送られるものと認識していたのですが...」 はい、その認識で正しいです。ただ、GETでURLの後ろにくっつけるのも、POSTボディにクエリ文字列を入れるのも、サーバ側では普通どちらもリクエストとして解析されます。
settyan

2016/06/17 08:08

詳しいご解答ありがとうございます。 解析の箇所までは知りませんでした。 ありがとうございます。
masaya_ohashi

2016/06/17 08:13

iOSの動作テストはご自分のPCのXcodeですか?iPhoneですか?
settyan

2016/06/17 08:28 編集

両方です。 Xcodeでのiosシュミレータはiphone6のios8以降 実機はiphone5sのios7.0でした。 で、両方だめでした
masaya_ohashi

2016/06/17 08:44

回答に追記したテストを行ってみてください。iOSが悪いのかサーバが悪いのかわかるはずです。
settyan

2016/06/20 01:12

すみません、お待たせしました。 上記のような形で返ってきたのですが... コレはおそらくサーバ側がいけないのですよね?
masaya_ohashi

2016/06/20 01:37

見たところ、iOSからのjson送信は正しいということになりますので、サーバ側の受信がおかしいことになります。 「上記URLの返信を受けてやったこと。」に以下①のphp文とありますが、php://inputは一回読み込んだら中身空っぽになるので出来ないと思いますよ?(サーバのバージョンや設定によっては開き直せば読み込めるものもあるそうですが) http://php.net/manual/ja/wrappers.php.php
settyan

2016/06/20 01:43

申し訳ありません。if文から下の行をということです。言葉足らずですみません。
settyan

2016/06/20 01:44

そしてここまでお付き合いしていただいて申し訳ないんですが、なぜかできました。詳しいことはアンサーのほうに乗せます。ありがとうございました。
guest

回答4

0

ベストアンサー

iOSからサーバへ送信するデータはNSURLSessionではなくNSMutableURLRequestで決まっています。
あなたの「iOSで送信しているコード部」が質問文にないので指摘しようがありません。
jsonデータを送るなら、NSMutableURLRequestはPOSTメソッドが望ましいでしょう。
POSTメソッドであれば、NSMutableURLRequestのsetHTTPBodyにクエリ文字列を渡すことでサーバへデータを渡せます。setHttpBodyで渡すべきクエリ文字列は、Javaで受け取るコードを変えないのであれば以下のような形になるはずです。

json={"test":"test", "test2":1}
↓json文字列部分をURLエンコード
json=%7B%22test%22%3A%22test%22%2C%20%22test2%22%3A1%7D

#追記
質問文のコードが追加されたので指摘を追記します。

Java

1request.getParameter("json")

このServletRequest#getParameterは、特定のルールに基づいたデータを解析してデータを取得しています。その特定のルールというのがクエリ文字列と呼ばれるものです。クエリ文字列はXXX=YYYという、イコールで結ばれた「名前」と「値」です。XXX=YYY&AAA=BBBといった文字列を、URLで見たことがありませんか?
で、上記コードに戻りますが、これはクエリ文字列がjson=XXXXXXXXXXXだった時にXXXXXXXXXXXを受け取る処理です。つまり、あなたがiOSから送るPOSTデータはjson=XXXXXXXXXXXという形でなければなりません。
ここであなたのiOSのコードを見てみましょう。

Objective

1NSArray *lData = @[@{@"loginID":@"yamada",@"password":@"hello"}]; 2NSData *data = [NSJSONSerialization dataWithJSONObject:lData options:NSJSONWritingPrettyPrinted error:nil];

ここで得られるdataにはどのような文字列が格納されているか?iOSの環境が手元にないので確認できませんが、こんな文字列になっているでしょう。

JSON

1[{"loginID":"yamada","password":"hello"}]

そして、この文字列をそのままsetHTTPBodyで送信データとして格納しています。
これはクエリ文字列の形式を保っていません。あるべき送信データの形はこうです。

json=[{"loginID":"yamada","password":"hello"}]

そして、クエリ文字列の「値」の部分はURLエンコードされている必要があるため、

json=%5B%7B%22loginID%22%3A%22yamada%22%2C%22password%22%3A%22hello%22%7D%5D

こうなります。なので、最終的にNSDataに上記文字列が入っていればJavaのgetParameterで受け取れるはずです。

私が教えられるのはここまでです。iOSでURLEncodeする方法は自分で調べてみてください。

###動作テスト
https://posttestserver.com/

以下のURLにPOSTを行うと、サーバで送られたデータのログが保存され、それを参照することができます。
http://posttestserver.com/post.php
接続先URLをこのURLに変えてみてアクセスしてみてください。レスポンスに「どこのURLに保存した」といった旨の記載があるので、Xcode上でレスポンスを解析して、該当URLへアクセスしてみてください。

念のため伝えておきますが、上記ツールに送信するデータは
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
絶対に本当のパスワードやIDを送信してはいけません。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

このツールに限ったことではないですが、「自身の管理の外のWebツール」には絶対にセキュリティ情報や漏れてほしくない情報をPOSTしてはいけません。どんなふうに悪用されても責任は取れません。

投稿2016/06/16 10:26

編集2016/06/17 08:58
masaya_ohashi

総合スコア9206

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

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

settyan

2016/06/17 01:09

ご解答ありがとうございます。 ご指摘の部分を修正、追加いたしました。 お手数ではございますが、ご確認していただければ幸いです。
settyan

2016/06/17 02:07

ご解答ありがとうございます。 調整してみます!
settyan

2016/06/17 06:46 編集

回答していただいた内容で試してみたんですが、どうにもうまくいきませんでした。 なので、javaで受け取るのはあきらめようと思います。 わざわざ回答していただいたのに申し訳ございません。 ありがとうございました。
settyan

2016/06/17 09:40

ご指摘ありがとうございます。気をつけます。 で、色々と試行錯誤してみたのですが、レスポンスからURLが取り出せません。 ステータスコードは取り出せて200が帰ってきたのですが... どの様に取り出せばいいのでしょうか? 申し訳ありませんがご回答の程お願いいたします。
masaya_ohashi

2016/06/17 09:44

delegateのdidReceiveDataにdataとして渡されたデータを文字列でコンソールにでも出力してみてもらえますか?ツールのレスポンスはただの文字列なのでNSStringにでも変換してみてください。私がテストしたときはこんなレスポンスでした。 Successfully dumped 1 post variables. View it at [データが保存されているURL] Post body was 0 chars long.
guest

0

JSONとかちゃんと扱ったことがなくてよく分からないのですが、ググッて眺めていると、

Objective

1[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 2[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];

こういう風にしているのが目に付きました。
関係ないでしょうか?

投稿2016/06/17 09:27

fuzzball

総合スコア16731

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

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

settyan

2016/06/17 09:41 編集

ありがとうございます。 やってみます。
settyan

2016/06/20 01:14

上記の二文を追加しても結果は変わりませんでした... ご解答ありがとうございました。
guest

0

なぜかわかりませんが、解決いたしました。。。
あ…ありのまま 今 起こった事を話すぜ!

上記のURLの返答を受けて、サーバー側のファイル(といっても、php.iniのみ)のallow_url_fopenがONになっていることを確認してファイルを閉じて(変更はせずにただ開いてとじただけ)でとれるようになりました.
..
な… 何を言っているのか わからねーと思うが
おれも 何をしたのか わから(ry

結果がおそらく判明いたしました。
おそらくではありますが、ios側のコードの不備でした。
送ったデータを受け取る場合と、もともと向こう側にあるデータをもらってくるコードは違うらしく、自分達はひたすらに向こうがわにあるデータを見ていたようです。

ご解答してくださった皆さん、本当にありがとうございました。
ご迷惑をおかけしました。
ありがとうございました。

投稿2016/06/20 06:36

settyan

総合スコア60

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

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

0

なぜかわかりませんが、解決いたしました。。。
あ…ありのまま 今 起こった事を話すぜ!

上記のURLの返答を受けて、サーバー側のファイル(といっても、php.iniのみ)のallow_url_fopenがONになっていることを確認してファイルを閉じて(変更はせずにただ開いてとじただけ)でとれるようになりました.
..
な… 何を言っているのか わからねーと思うが
おれも 何をしたのか わから(ry

ご解答してくださった皆さん、本当にありがとうございました。
ご迷惑をおかけしました。
ありがとうございました。

投稿2016/06/20 02:03

settyan

総合スコア60

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

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

settyan

2016/06/20 02:07

一応動くようにはなったんで、自己解決を載せさせていただいたのですが、原因がわからないのはもやもやするので、何かわかる方がいらっしゃれば回答いただけると幸いです。
fuzzball

2016/06/20 02:10

時間があるなら原因を特定しておいた方がいいですよ。
settyan

2016/06/20 02:18

コメントありがとうございます。今自分なりに調べています!
fuzzball

2016/06/20 02:27

あー、コメントが入れ違いになってしまいました。試したことを一つ一つ元に戻してみれば分かるような気もしますが、複合要因だと難しいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問