URLConnectionで日本語を送りたい!

このQ&Aのポイント
  • HTMLのフォームからPOSTされた内容をHTMLにして表示する掲示板Servletに、Javaアプリケーションから接続、POSTをかけた場合、半角英数字は問題なく渡せますが、日本語が化けてしまいます。エンコードを行う必要がありますが、具体的にどのようにすれば良いのでしょうか。
  • 考え方や実装の方法についてもご教授いただけると幸いです。
  • 以下のソースコードは該当箇所です。間違いや改善点があればご指摘いただけると助かります。 URL u = new URL("http://URL"); uc = u.openConnection(); uc.setDoOutput(true); uc.setUseCaches(false); String str_stream ="name=Qookies&subject=Question&value=日本語を送りたいです。。"; ObjectOutputStream outstr = new ObjectOutputStream(uc.getOutputStream()); outstr.writeObject(str_stream);
回答を見る
  • ベストアンサー

URLConnectionで日本語を送りたいのですが。。

HTMLのフォームからPOSTされた内容をHTMLにして表示する掲示板Servletがあります。 このServletに、Javaアプリケーションから接続、POSTをかけて、HTMLのフォームからPOSTした場合と同じ動作をさせようと考えています。 半角英数字はServletに渡せるのですが、日本語が化けてしまいます。 エンコード等しなくてはならないものと考えますが、どのようにしたらよいのでしょうか。 ご教授、よろしくお願い致します。 該当個所のソースが以下です。 考え方等、間違っているようでしたら、合せてご指摘いただければ幸いです。 URL u = new URL("http://URL");  uc = u.openConnection();  uc.setDoOutput(true);  uc.setUseCaches(false); String str_stream ="name=Qookies&subject=Question&value=日本語を送りたいです。。"; ObjectOutputStream outstr = new ObjectOutputStream(uc.getOutputStream()); outstr.writeObject(str_stream);

noname#744
noname#744
  • Java
  • 回答数1
  • ありがとう数188

質問者が選んだベストアンサー

  • ベストアンサー
noname#9414
noname#9414
回答No.1

送る際にはあまり気にしないでいいのではない でしょうか。CGIにしても、Servletにしても 最終的に受け取る側が、日本語だと判断できれば いいはずなので、Servlet側で、デコードして あげればどうでしょうか。 #Servletは使ったことがないので、デコードの #仕方はわかりません。たぶん、Perlのjcode.plの #ようなものがあるのでは・・・ 出来ないときは補足してください。 ではでは☆

noname#744
質問者

お礼

遅くなりましたが、おっしゃるとおり、Servlet側のデコード処理に問題がありました。 ありがとうございました。

関連するQ&A

  • Javaを使ったチャットシステムについて

    はじめまして。 チャットシステムを作ろうと思い他の方が制作されたソースコードを拝見させて頂いたのですがよくわかりませんでした。 よろしければ教えて頂けないでしょうか? よくわからなかったのは読込・書込処理の部分です。 どういう流れで会話のやり取りが行われているのかよくわかりません。 例えば、Aさんが書き込んでBさんがその書き込みを見るまで、のような一連の流れです。 ・読込処理 URL wi_url = new URL(p_url+"chat1.cgi"); URLConnection wi_connect = wi_url.openConnection(); wi_connect.setDoInput(true); wi_connect.setDoOutput(true); wi_connect.setUseCaches(false); OutputStream wo_stream = wi_connect.getOutputStream(); BufferedWriter wo_buffer = new BufferedWriter(new OutputStreamWriter(wo_stream)); wo_buffer.write("read", 0, 4); wo_buffer.flush(); wo_buffer.close(); InputStream wi_stream = wi_connect.getInputStream(); BufferedReader wi_buffer= new BufferedReader(new InputStreamReader(wi_stream)); ・書込処理 URL wo_url = new URL(p_url+"chat2.cgi"); URLConnection wo_connect = wo_url.openConnection(); wo_connect.setDoOutput(true); wo_connect.setDoInput(true); wo_connect.setUseCaches(false); OutputStream wo_stream = wo_connect.getOutputStream(); BufferedWriter wo_buffer = new BufferedWriter(new OutputStreamWriter(wo_stream)); wo_buffer.write(w_data, 0, w_data.length()); wo_buffer.flush(); wo_buffer.close(); InputStream wi_stream = wo_connect.getInputStream(); BufferedReader wi_buffer = new BufferedReader(new InputStreamReader(wi_stream));

  • HttpURLConnectionを使ったHTTP

    HttpURLConnectionを使ったHTTP通信について質問です。 POSTメソッドで、JSON形式のデータを送信しています。 送信先URLは自作のサーブレットです。 HTTP接続はできましたが、サーブレット側でJSON形式のデータをどのように取得すればよいかが分かりません。 JSON形式ではなく「p1=aaa&p2=bbb」のようなパラメータであれば、getParameter("p1")で取得できるのですが・・・ ソースの抜粋は以下の通りです。 <クライアント側>--------------------------------------------------- URL url = new URL("サーブレットのURL"); HttpURLConnection uc = (HttpURLConnection) url.openConnection(); uc.setDoOutput(true); uc.setRequestMethod("POST"); String postStr = "{\"id\": \"blog\"}"; OutputStream os = uc.getOutputStream(); PrintStream ps = new PrintStream(os); ps.print(postStr); ps.close(); InputStream is = uc.getInputStream(); ------------------------------------------------------------------- <サーブレット側>--------------------------------------------------- public void doPost(HttpServletRequest request, HttpServletResponse response)     throws IOException, ServletException {     // ここでpostStr の内容を取得したい! } ------------------------------------------------------------------- JAVAの知識が浅いため、分かりにくい質問になっていたらすいません。 ご存知の方、よろしくお願いします。

  • JavaでPOSTでデータ送信時のボディについて

    javaでHTTP通信をする際にメソッドをPOSTにしてボディにパラメータを設定する仕方がいまいちわかりません。 調べてみても、POSTはGETのようにURLに付加するのではなくボディ部に設定すればよいというのはわかったのですが。実際どういうソースで設定できるのか例が見つからなく困っています。 なんとなくの判断ですが、 message = "httpテスト"; URL url = new URL("http://~~~/xxx.html"); HttpURLConnection http = (HttpURLConnection)url.openConnection(); http.setRequestMethod("POST"); http.setDoOutput(true); http.setRequestProperty("Content-Type", "~~~"); http.setRequestProperty("Content-Length", Integer.toString(message.length())); ↓↓↓(1) BufferedWriter outer = new BufferedWriter(new OutputStreamWriter(http.getOutputStream())); outer.write(message); outer.flush(); outer.close(); ↑↑↑(1) http.connect(); 上記(1)の箇所でボディへの設定ができているのかなという判断をしているのですが、あっていますでしょうか?? よろしくお願いします。

    • ベストアンサー
    • Java
  • ファイルの書き出し方法について

    お世話になります。 ファイルの出力方法についての質問です。 inputstreamからファイルを作成するとき、もっとも高速に行うにはどのようにすればいいのでしょうか? とりあえず私は // URLクラスのインスタンスを生成 URL myURL = new URL("欲しいページ"); // 接続します URLConnection con = myURL.openConnection(); // 入力ストリームを取得 BufferedReader in = new BufferedReader( new InputStreamReader( con.getInputStream())); String tmp = ""; String str = ""; while((str=in.readLine())!=null){ tmp = tmp + str; } //その後strをファイルに書き出す。 という風にやっておりますが、もっと高速にする方法はないでしょうか? 私なりのイメージではstreamからstreamへ直接渡せないのかな?という ことができないのかなという疑問です。 (いちいちStringになおさなければいけないのかな?ということです。) 以上です。

    • ベストアンサー
    • Java
  • JavaでSSL通信について(JDK131)

    Javaを用いてSSL通信を行いたいと思っています。 しかし、SSL通信を行うには「HTTPSURLConnection」が 必要で、JDK14以上となっています。 JDK131で利用するにはどうすれば可能でしょうか?? よろしくお願いします。 ちなみに、HTTPはこんな感じですよね?? ======================== import java.io.BufferedReader; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.security.*; public class test { public static void main(String[] args) { String urlString = "https://XXX.cgi"; try { URL url = new URL(urlString); URLConnection uc = url.openConnection(); // POST可能にする uc.setDoOutput(true); // POST用のOutputStreamを取得 OutputStream os = uc.getOutputStream(); // POSTするデータ String postStr = "foo1=bar1&foo2=bar2"; // データをPOSTする PrintStream ps = new PrintStream(os); ps.print(postStr); ps.close(); } catch (MalformedURLException e) { System.err.println("Invalid URL format: "                    + urlString); System.exit(-1); } catch (IOException e) { System.err.println("Can't connect to "                    + urlString); System.exit(-1); } } }

  • Java(Servlet,JSP)を使用してあるURLにHTTPリクエスト(POST)を送信する方法

    あるWeb APIを使用したWEBアプリケーションを作成しています. JavaのServletやJSPで実装していますが,サンプルではGETでリクエストを送る方法だけが紹介されていました. APIがPOSTに対応しているので,POSTでリクエストを送信しようと思います. サンプルは以下のようになっていましたが,POSTでリクエストを送信する場合,どう変更すれば良いでしょうか? URL url = new URL("http://xxxxxx.xx/xx/?q=" + URLEncoder.encode(request.getParameter("data"), "UTF-8")); URLConnection con = url.openConnection(); InputStream stream = con.getInputStream(); リクエストは日本語を含むデータをパラメータに含める予定です.

    • ベストアンサー
    • Java
  • javaでTwitterのOAuth認証を用いたつぶやきのポストを実現

    javaでTwitterのOAuth認証を用いたつぶやきのポストを実現したいと考えています。アクセストークンとアクセストークンシークレットは取得できたのですがそれを用いてつぶやきをポストすることができません。OAuthのライブラリを使えばポストすることは出来たのですができればライブラリを使わずに実現したいと思っています。おそらくポストのやりかたがおかしいと思うのですが何が悪いのかわかりません。javaはあまり得意ではないためお見せするのも恥ずかしいソースですがおかしなところを指摘していただけるとありがたいです。ポストの部分を載せます。 String url="http://twitter.com/statuses/update.xml"; URL urlObj=new URL(url); HttpURLConnecton urlCon=(HttpURLConnection)urlObj.openConnection();urlCon.setRequestMethod("POST"); urlCon.setDoOutput(true); urlCon.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); urlCon.setRequestProperty("Authorization",header); //変数headerには以下のような文字列が入っています //OAuth oauth_nonce="****", oauth_signature_method="HMAC-SHA1", oauth_timestamp="****", oauth_consumer_key="****", oauth_token="****", oauth_signature="****", oauth_version="1.0" String body="status=test"; PrintWriter pw=new PrintWriter(urlCon.getOutputStream()); pw.print(body); pw.flush(); pw.close(); //ここでエラー BufferedReader inStr=new BufferedReader(new InputStreamReader(urlCon.getInputStream()));

    • ベストアンサー
    • Java
  • CGIにPOSTでアクセス

    import java.net.*; import java.io.*; import java.awt.*; public class ccc28 extends java.applet.Applet { TextField tf; Button btn; TextArea ta; public void init() { setLayout(new BorderLayout()); tf = new TextField(20); btn = new Button("Submit"); ta = new TextArea(5, 25); add("West", tf); add("East", btn); add("South", ta); } public boolean action (Event e, Object o) { if (e.target == btn) { try { URL url = new URL("http://www.odn.ne.jp/aaa/test.cgi"); URLConnection uc = url.openConnection(); uc.setDoInput(true); uc.setDoOutput(true); uc.setUseCaches(false); PrintWriter pw = new PrintWriter(uc.getOutputStream()); pw.print("a"); pw.close(); } catch(java.security.AccessControlException er) { ta.setText(er.getMessage()); } tf.setText("処理完了"); return true; } return false; } } アプレットビューアからの実行では、 tf.setText("処理完了"); は実行されました。 catchのta.setText(er.getMessage());も実行されて、 access denied (java.net.SocketPermission www.odn.ne.jp resolve) と書かれていました。 実際にアップロードしてからの実験ではボタンを押しても、テキストエリアにもテキストフィールドにも何も表示されませんでした。 どっちの実験でも、CGIへのアクセスができませんでした。 CGIはカウンターです。アクセスさえできればいいんだけど、 http://www.tetras.co.jp/yada/j_java_cgi_r.htm のサイトに書いてあった getAppletContext().showDocument(url); を使うと、ページがCGIに飛んでしまったから、POSTでアクセスしたいと思っています。 このソースをどう直せばいいんですか?

  • getOutputStream()の取得が遅い

    とあるサーバーBに存在するPHPのAPIにアクセスする下記プログラムを書いたのですが ある条件下でレスポンスが遅く原因がわからないので質問させてください。 下記プログラムを職場のパソコンから実行したところうまくいき結果も得ることができました。 ところがこれをサーバーAにアップロードし、サーバーA上で実行したところ 結果は返ってきたのですがレスポンスがものすごく遅く使い物になりませんでした。 どこがボトルネックになっているのかデバッグしてみたところ OutputStream out = con.getOutputStream(); の部分の実行にすごく時間がかかっていることがわかりました。 職場では「名前の解決に時間がかかっているのでは・・・」という意見もありましたが getOutputStream()の実行前に URLConnection con = url.openConnection(); でコネクションを張っているのでこの時点でサーバーAからサーバーBには接続されていて 名前の解決はできているのではと思ったのですがこの認識はあってますでしょうか。 getOutputStream()はサーバーAからサーバーBにデータを送信するための データの通り道を作成しているという認識です。 そうならばこのデータの通り道を作成するの時間がかかる原因は何が考えられますでしょうか。 ちなみに職場のPCからサーバーBへはインターネットを介して接続しています。 サーバーAとサーバーBは同じLAN内にあるサーバーです。 public void sendTest(String apiUrl, String apiParam) { try {    apiUrl="http://test.sample.jp"; ← 職場PCで当プログラムを実行するときはこちらを使用                 apiUrl="http://192.168.1.15"; ← サーバーA上で当プログラムを実行するときはこちらを使用 URL url = new URL(apiUrl); URLConnection con = url.openConnection(); con.setDoOutput(true); //-------------------- //送信する //-------------------- OutputStream out = con.getOutputStream(); OutputStreamWriter ow1 = new OutputStreamWriter(out); BufferedWriter bw1 = new BufferedWriter(ow1); //POSTの内容を書き出す bw1.write(apiParam); bw1.close(); ow1.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • javaアプレットとPHPの通信

    タイトルの通りなのですが、 javaアプレットで出た結果(Stringや数値)を phpに送信する方法が知りたいです。 他のサイトを調べていたら、 下の様なプログラムがありました。 private String send(String stArg) { try { //送信先URL URL url = new URL(getCodeBase(), "sample.php"); //ネットワーク接続 URLConnection urlCon = url.openConnection(); urlCon.setDoOutput(true); urlCon.setDoInput(true); urlCon.setAllowUserInteraction(false); //送信処理 PrintWriter writer = new PrintWriter(urlCon.getOutputStream()); writer.print(stArg); writer.close(); } catch (Exception e) //エラー処理 { e.printStackTrace(); } return "error"; } } これはString stArgをsample.phpに送る処理だと 書いてあったのですが、 php側でどういった様に受信すれば良いのかがわかりません。。。 自分のイメージとしては、アプレットから送信したデータ(stArg)を php上でPOST[$stArg]と言った形で受信したいです。 私の考え方自体がおかしいかもしれないですが、 何か良い方法、または良いサイトを知っていたら お教えいただきたいです。

専門家に質問してみよう