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

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

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

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

API

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

Q&A

解決済

3回答

454閲覧

JAVAでPOSTしたいがエラーがでます

musicexbp

総合スコア13

Java

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

API

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

0グッド

1クリップ

投稿2017/10/05 10:34

編集2017/10/06 08:45

###前提・実現したいこと
javaでdocomoAPI音声認識にPOSTしたいのですがエラーがでる
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=speech_recognition&p_name=api_amivoice_1#tag01
APIリファレンスです
###発生している問題・エラーメッセージ
必須パラメータがない とエラーが帰ってくる
POSTはできている模様です

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package libs; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author KITT */ public class test { public test() throws IOException{ String boundary ="JT49KPkVKrz2Y4YrGhLezUP8fWHU6kARBrpKRpuNsjXm"; String based=null;//base64に変換後、文字列として格納 FileSystem fs = FileSystems.getDefault(); Path p = fs.getPath("C:\voice.raw"); Charset charset = StandardCharsets.UTF_8;//キャラセットをUTF-8にする byte[] vb = Files.readAllBytes(p);//voice.rawを読み込む try { URL url =new URL("https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY=XXXXXXXXXXXXXXXXX");//APIkeyは省略 URLConnection con=url.openConnection(); con.setDoOutput(true); OutputStreamWriter writer=new OutputStreamWriter(con.getOutputStream()); BufferedWriter bw1 = new BufferedWriter(writer); /*送信文字列*/ bw1.write("Content-Type: multipart/form-data; boundary=<"+boundary+">\r\n--<"+boundary+">\r\nContent-Disposition: form-data; name=\"v\"\r\n\r\n"); bw1.write("on\r\n--<"+boundary+">\r\n"); bw1.write("Content-Disposition: form-data; name=\"a\";filename=\"voice.raw\"\r\n"); bw1.write("Content-Type: application/octet-stream"); bw1.write("\r\n\r\n"); java.util.Base64.Encoder Encoder = java.util.Base64.getEncoder(); based=Encoder.encodeToString(vb); bw1.write(based); bw1.write("\r\n"); bw1.write("--<"+boundary+">--"); bw1.flush(); bw1.close(); //受信 InputStream stream = con.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); String responseData = null; while((responseData = reader.readLine()) != null){ System.out.print(responseData); } stream.close(); } catch (MalformedURLException ex) { Logger.getLogger(test.class.getName()).log(Level.SEVERE, null, ex); } }} ###該当のソースコード```Java コード

PYTHONでのPOSTには成功していますが、JAVAでPOSTしたいと思い作成中です
###試したこと
APIリファレンス通りに文字列を入力した
文字列のfilenameをvoice.rawにした
キャラセットをUTF-8にしたり、outputstreamのキャラセットをUTF-8にしたりしたが、同じ返答結果になる

###補足情報(言語/FW/ツール等のバージョンなど)
netbeans jdk1.8 win10

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

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

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

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

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

guest

回答3

0

ベストアンサー

"<"">"こいつら含めたらいけないとか・・・?

境界区切子

追記
含めたらいけなかったです。

API弄って処理が通ったっぽいコードを置いておきます。
変更箇所としては3つ、
・multipartの記述は、multipartの仕様に沿った形に修正("<" ">"を削除)
・一番最初のContent-Typeの設定をsetRequestPropertyで行うように
・音声データはバイナリを直接書き込み
(他にしれっと治ってるところがあるかもしれないです。)

Java

1 URL url = new URL("https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY=XXXXXXXXXXXXXXXXX"); 2 3 HttpsURLConnection con = (HttpsURLConnection)url.openConnection(); 4 con.setDoOutput(true); 5 6 con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 7 8 OutputStream outputStream = con.getOutputStream(); 9 outputStream.write(("--" + boundary + "\r\n").getBytes(charset)); 10 outputStream.write(("Content-Disposition: form-data; name=\"v\"\r\n").getBytes(charset)); 11 outputStream.write(("\r\n").getBytes(charset)); 12 outputStream.write(("on").getBytes(charset)); 13 outputStream.write(("\r\n--" + boundary + "\r\n").getBytes(charset)); 14 outputStream.write(("Content-Disposition: form-data; name=\"a\"; filename=\"audio_sample_amivoice.raw\"\r\n").getBytes(charset)); 15 outputStream.write(("Content-Type: application/octet-stream\r\n").getBytes(charset)); 16 outputStream.write(("\r\n").getBytes(charset)); 17 outputStream.write(Files.readAllBytes(p)); 18 outputStream.write(("\r\n--" + boundary + "--\r\n").getBytes(charset)); 19 outputStream.flush(); 20 outputStream.close(); 21 22 //受信 23 InputStream stream = con.getInputStream(); 24 BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); 25 String responseData = null; 26 while ((responseData = reader.readLine()) != null) { 27 System.out.println(responseData); 28 } 29 30 stream.close();

投稿2017/10/06 08:59

編集2017/10/06 14:24
abs123

総合スコア1280

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

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

musicexbp

2017/10/06 11:37

すみません やってみましたが、失敗しました たぶん、BASE64でなく、バイナリで送るのだろうと思います byte配列をPOSTシたい場合どうすればよいでしょうか bw1.writeに配列を指定してもエラーがでます。。。
musicexbp

2017/10/07 02:13

ありがとうございます このあと、JACKSONというらいぶらりを使い textを抽出、結果をかえすことができるようになりました これからも、日々精進したいです
guest

0

あなたの提示されたページには以下のようなリクエストサンプルが記載されています。

POST https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

Content-Type: multipart/form-data; boundary=<バウンダリ文字列>

--<バウンダリ文字列>
Content-Disposition: form-data; name="v"

on
--<バウンダリ文字列>
Content-Disposition: form-data; name="a"; filename="sample.adc"
Content-Type: application/octet-stream

音声データ(binary)
--<バウンダリ文字列>--

これに対し、あなたのコードで生成されるリクエストはこうです。

POST https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

Content-Type: multipart/form-data; boundary=<バウンダリ文字列>
Content-Disposition: form-data; name="v"

on
--<バウンダリ文字列と違うランダムな文字列>
Content-Disposition: form-data; name="a"; filename="voice.raw"
Content-Type: application/octet-stream
音声データ(binary)
--<バウンダリ文字列>--

  • Content-Disposition: form-data; name="v"の前にバウンダリと改行が1つ足りない
  • vの後のバウンダリが最初に定義したバウンダリと違う
  • 音声データの前に改行が1つ足りない

の三点です。
実際に生成されるリクエストを想像しながら見比べたら分かる問題です。プログラマに陥りがちな「プログラムは思った通りには動かない、書いたとおりに動く」というやつです。

投稿2017/10/06 00:58

編集2017/10/06 01:03
masaya_ohashi

総合スコア9206

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

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

musicexbp

2017/10/06 08:49

コードをなおしてみました 見落としがあるかもしれませんが、結果は変わらず-2です コンソール出力は {"code":"-2","message":"\u5fc5\u9808\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093","text":"","utteranceid":"","reserved":""}zzz です 文字化け解消ツールを使うと必須パラメータがないと描いてあります
masaya_ohashi

2017/10/06 08:59

Content-Type: multipart/form-data; boundary=<バウンダリ文字列> のあとに改行が1つ足りません。
momon-ga

2017/10/06 09:28

ちなみに、送信するデータはバイナリで送る?それともbase64どちらなのでしょう?
musicexbp

2017/10/06 10:00

たぶん、バイナリなのかなぁ ちょっとわかりませんが、 そう言われれば、リファレンスにバイナリって書いてあります すみませんが、バイナリで送るにはどうしたらいいのでしょうか? 読み込んだbyte配列をそのまま 送ってやればいいんでしょうか?
guest

0

bw1.write("on\r\n--<WZtMKGjB8YjFZgeAcEYCKKZREUD4ah2QxsGarLWDB6yp>\r\n");

バウンダリが違うからでは?

投稿2017/10/05 10:47

momon-ga

総合スコア4820

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

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

musicexbp

2017/10/05 13:28

変数boundaryと同じものにしましたが、結果は同じでした バウンダリは調べますと、乱数であればなんでも良いそうです(被らなければ)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問