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

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

ただいまの
回答率

90.76%

  • PHP

    19202questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Java

    13158questions

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

  • JSON

    1062questions

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

  • POST

    221questions

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

Javaでのjson文字列のPOST送信をしたい。

解決済

回答 3

投稿 編集

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

ysuzu6

score 43

前提・実現したいこと

Javaでjsonを文字列をPOSTして結果を表示する。
受け取り側ではjsonの処理をしてレスポンスを返したいです。

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

送信して処理結果のレスポンスを受け取ることは出来ましたが、json文字列を送れていない(または、php側でjsonが受け取れていない)ようです。

Content-Typeapplication/jsonとすると、リクエストのbodyに文字列が書き込まれるのではないでしょうか?

受け側のphpではfile_get_contents('php://input')の中身が空になっています。

また、curlでPOSTした場合は、リクエストのbodyの文字列が取得できます。

該当のソースコード

送信側

/**
 * @param strPostUrl "http://{hostname}/"
 * @param formParam "{\"account\":\"piyo\", \"pass\":\"hoge\"}"
 */
public String callPost(String strPostUrl, String formParam) {

    HttpURLConnection con = null;
    StringBuffer result = new StringBuffer();

    try {

        URL url = new URL(strPostUrl);

        con = (HttpURLConnection) url.openConnection();

        con.setDoOutput(true);
        con.setRequestMethod("POST");
        con.setRequestProperty("Accept-Language", "jp");
        con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
        OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
        out.write(formParam);
        out.close();
        con.connect();

        // HTTPレスポンスコード
        final int status = con.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            // 通信に成功した
            // テキストを取得する
            final InputStream in = con.getInputStream();
            String encoding = con.getContentEncoding();
            if (null == encoding) {
                encoding = "UTF-8";
            }
            final InputStreamReader inReader = new InputStreamReader(in, encoding);
            final BufferedReader bufReader = new BufferedReader(inReader);
            String line = null;
            // 1行ずつテキストを読み込む
            while ((line = bufReader.readLine()) != null) {
                result.append(line);
            }
            bufReader.close();
            inReader.close();
            in.close();
        } else {
            System.out.println(status);
        }

    } catch (Exception e1) {
        e1.printStackTrace();
    } finally {
        if (con != null) {
            // コネクションを切断
            con.disconnect();
        }
    }
        // 実行結果
    System.out.println("result=" + result.toString());

    return result.toString();

}

受け取り側

<?php 
// リクエストのbody部分を読む
$json_string = file_get_contents('php://input');

// 文字列の確認
echo $json_string; // {"account":"piyo", "pass":"hoge"}

// jsonへのパース
$obj = json_decode($json_string);
// 要素の表示
print $obj->{'account'}; // hoge

結果

result=


result={"account":"piyo", "pass":"hoge"}piyoと表示してほしい。

試したこと

  • curlから受け側の確認
$ curl -H "Content-type: application/json" -X POST -d "{\"account\":\"piyo\",\"pass\":\"hoge\"}" http://{hostname}/

結果
送信したjsonに対して、想定の結果を返している。

{"account":"piyo","pass":"hoge"}piyo
  • レスポンスの確認
<?php 
$account = "piyo";
$pass = "hoge";


$json_array = array(
    'account' => $account,
    'pass' => $pass,
);

header("Content-Type: text/javascript; charset=utf-8");
# JSON 形式にエンコードしてechoでPOST送信
echo json_encode($json_array);

結果
jsonの文字列が返ってくる。

result={"account":"piyo","pass":"hoge"}
  • OutputStreamWriterのclose()をflush()に変更
    結果に変化はなかった。

  • OkHttpを使って送信する。
    http://square.github.io/okhttp/
    サンプルソースのURLとjsonを変更して実行したが、結果は空だった。

補足情報(言語/FW/ツール等のバージョンなど)

java 8
php 7.1

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

直接の回答ではありませんが・・・

Java標準でHTTPを扱うのはオススメできません。
使用するライブラリに制限が無ければOkHttpClientをオススメします。

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

http://square.github.io/okhttp/

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/20 10:33

    ご回答ありがとうございます。
    使用するライブラリに制限はありません。

    サンプルソースのURLとjsonを変更して試しましたが出力はありませんでした。
    [sample](https://raw.githubusercontent.com/square/okhttp/master/samples/guide/src/main/java/okhttp3/guide/PostExample.java)

    キャンセル

+1

> out.close();


この位置でcloseしてしまうと、正常にPOSTパラメータを送信できていない気がします。
下記のどちからの対応でどうでしょうか?

案1)close()ではなく、flush() して強制的にstreamに出力する
案1で駄目な場合)Content-Lengthヘッダで送信するバイト数を指定してみる

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/20 10:05

    ご回答ありがとうございます。

    > 案1)close()ではなく、flush() して強制的にstreamに出力する
    out.close()の代わりにout.flush()を書きましたが出力が出ませんでした。

    >案1で駄目な場合)Content-Lengthヘッダで送信するバイト数を指定してみる
    ```java
    // POSTデータの長さを設定
    con.setRequestProperty("Content-Length", String.valueOf(formParam.length()));
    ```
    こちらを追記しましたが出来ていません。

    キャンセル

check解決した方法

0

自己解決しました。
urlの書き方が間違っていたようです。。

質問にはhttp://{hostname}/としていましたが、javaで実行していたurlはhttp://{hostname}/api/loginです。
host側のパスは/var/www/html/api/login/index.phpであるため、正しいurlはhttp://{hostname}/api/login/index.phpまたは、http://{hostname}/api/login/でした。

curlや他に試したpythonでうまくいった理由も、正しいurlを使用していたためです。

必要な情報を書いておらず、申し訳ございません。
ご回答して下さったaglkjggg様、kitaji0306様ありがとうございます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • PHP

    19202questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Java

    13158questions

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

  • JSON

    1062questions

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

  • POST

    221questions

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