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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2487閲覧

PHPのheader()で返したURLをJavaで受け取ってテキスト出力したい

risaito74

総合スコア44

Java

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/11/07 04:53

htmlのFormでメールアドレス,パスワードをPOSTして、受信側のPHPで任意の文字列(仮にhoge)と一致した場合は「ログインOK」が表示されるhtml、一致しなかった場合は「ログインNG」が表示されるhtmlを作り、サーバにアップして問題なく動作しています。(URLは仮のものです)

html

1 2<form action="http://hoge.ne.jp/php/postres.php" method="POST"> 3 <input type="text" name="email" placeholder="メールアドレス"/> 4 <input type="password" name="password" placeholder="パスワード"/> 5 <input type="submit" name="_goto:login" value="ログイン"/> 6</form> 7

PHP

1 2<?php 3 4$email = $_POST["email"]; 5$password = $_POST["password"]; 6 7 //echo "email = ".$email."\n"; 8 //echo "password = ".$password."\n"; 9 //echo "_goto:login = ".$submit."\n"; 10 11if ($email === "hoge" && $password === "hoge") { 12 //echo "login OK!"; 13 header( "Location: http://hoge.ne.jp/php/login_ok.html" ) ; 14 exit() ; 15} else { 16 //echo "login NG!"; 17 header( "Location: http://hoge.ne.jp/php/login_ng.html" ) ; 18 exit() ; 19} 20 21?> 22 23

このhtmlフォームをJavaで自動化するプログラムを作っていますが、PHP側でecho()でテキストを返す場合は、問題なくJavaで受け取れました。ですが、echo()をコメントアウトしてheader()にすると、何も帰ってきません。エラーも出ません。

Java

1 2import java.net.*; 3import java.io.*; 4 5public class Main { 6 public static void main(String[] args) throws IOException { 7 String param = "email=hoge&password=hoge"; 8 URL url = new URL("http://hoge.ne.jp/php/postres.php"); 9 10 // 接続用HttpURLConnectionオブジェクト作成 11 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 12 13 con.setRequestMethod("POST"); 14 con.setDoInput(true); 15 con.setDoOutput(true); 16 con.setFixedLengthStreamingMode(param.getBytes().length); 17 //con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 18 19 //conの送信用ストリーム作成 20 DataOutputStream os = new DataOutputStream(con.getOutputStream()); 21 22 con.connect(); 23 24 os.write(param.getBytes()); 25 os.flush(); 26 27 if( con.getResponseCode() == HttpURLConnection.HTTP_OK ){ 28 //conのレスポンス受信用ストリーム作成 29 BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 30 String inputLine; 31 while ((inputLine = reader.readLine()) != null) { 32 System.out.println(inputLine); 33 } 34 reader.close(); 35 } 36 os.close(); 37 con.disconnect(); 38 } 39} 40

PHP側でheader()によってURLを返した場合、Java側ではどのように受け取ればhtmlを受け取れるでしょうか?
(コマンドプロンプト上でhtmlタグが出力できれば、それで構いません)
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

HttpURLConnectionのgetHeaderFields(), getHeaderField()メソッドで取得します。

https://docs.oracle.com/javase/jp/6/api/java/net/URLConnection.html#getHeaderFields()

java

1// レスポンスヘッダー全てを Map で取得 2Map headers = con.getHeaderFields(); 3// ヘッダフィールドの名前を指定して取得。 4// ex. Location ヘッダー 5System.out.println(con.getHeaderField("Location"));

追記:
リクエスト前に以下のように設定するとリダイレクトの際、自動でリダイレクト先を参照してくれますよ。
(リダイレクトされたことを認識する必要が無い場合はこれが一番簡単です。)

java

1// リダイレクトを自動で処理する 2con.setInstanceFollowRedirects(true); 3

投稿2016/11/07 05:18

編集2016/11/07 05:48
Y.H.

総合スコア7914

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

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

risaito74

2016/11/07 05:40

con.getHeaderField("Location") でPHPのheader()で指定したURLを取得できました!ありがとうございます! あとはこのURLのHTMLを読み取って出力する処理になりますが、まずは自力でチャレンジしてみます。
risaito74

2016/11/07 06:28

追記ありがとうございます! さっそくsetRequestMethod()直後にsetInstanceFollowRedirects(true)を入れてみたのですが、レスポンスコード302のままで特に挙動はかわりませんでした。 試しにsetInstanceFollowRedirects(false)にしても同様に302で、挙動の違いを確認することはできませんでした。 私の理解ではsetInstanceFollowRedirects(true)にするとリダイレクト処理は自動・勝手にされて、リダイレクト後のHTTP_OKがレスポンスコードで返ってくるものと思ったのですが(だからネット上の多くのサンプルではfalseで指定しろと書いてあると思ったのですが…) setInstanceFollowRedirects()はtrue/falseで何が変わるのでしょうか? 重ねての質問で申し訳ありません。自分でも調べてみますが、ご助言いただけますと助かります。
Y.H.

2016/11/07 06:51

え~私も自動でリダイレクトが処理され HTTP_OKが返ってくると思ってたのですが。。。 キャッシュを参照してるのかも知れないので、 con.setUseCaches(false); でキャッシュを使用しないようにしたらどうなりますか?
risaito74

2016/11/07 07:25

setUseCaches(false)を入れても変わらず302でした… (そういうことではないだろうと思いつつ)setInstanceFollowRedirects(true)/setUseCaches(false)を呼ぶタイミングを変えてみたり順序を変えてみたり試してみましたが、レスポンスコードはずっと302のままでした… モヤモヤした形になってしまいすみません。自分でも勉強を進めながら、必要に応じて改めて質問を立ててみます。
Y.H.

2016/11/07 07:29

おー。お役に立てずにすみません。
guest

0

headerの"Location"指定はリダイレクト指定ですので、クライアントには301や302のリダイレクトコードが返答されているはずです。
リダイレクトレスポンスですので、当然のことながらレスポンスボディは含まれず「何も返ってこない」ように見えますが、ヘッダ情報はしっかり返答されているはずです。
getHeader等でレスポンスヘッダをご確認ください。

投稿2016/11/07 05:17

kunai

総合スコア5405

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

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

risaito74

2016/11/07 05:43

ありがとうございます! レスポンスコードの返り値がHttpURLConnection.HTTP_OKではないという部分を勘違いしていました。(不勉強ですみません…) 他の方の助言と合わせて理解が一歩進みました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問