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

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

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

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

API

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

Q&A

解決済

1回答

633閲覧

YahooApiを使ってキーワードをSystem.out.printlnでコンソールに提示したい

Konakona_

総合スコア1

Java

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

API

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

0グッド

0クリップ

投稿2023/05/17 02:19

編集2023/05/17 02:59

実現したいこと

YahooApiを使ってキーワードをSystem.out.printlnでコンソールに提示したい
API:https://jlp.yahooapis.jp/KeyphraseService/V2/extract

前提

作ったプログラムでこのようにリクエストしているのが、このりくえすとはそもそもあっているのか。
Request{method=POST, url=https://jlp.yahooapis.jp/KeyphraseService/V2/extract, tag=null}

最近SE業界に入ったのでそもそも仕組みがわからない。

Web画面には、
タイプ ステータスレポート

メッセージ HTTPのGETメソッドは、このURLではサポートされていません。

説明 リクエストラインで受信されたメソッドは、オリジンサーバーによって認識されますが、ターゲットリソースによってサポートされていません。

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

Web画面 タイプ ステータスレポート メッセージ HTTPのGETメソッドは、このURLではサポートされていません。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー コンソール Request{method=POST, url=https://jlp.yahooapis.jp/KeyphraseService/V2/extract, tag=null} failed

説明 リクエストラインで受信されたメソッドは、オリジンサーバーによって認識されますが、ターゲットリソースによってサポートされていません。

試したこと

postリクエストはできているが成功していない。
Request{method=POST, url=https://jlp.yahooapis.jp/KeyphraseService/V2/extract, tag=null}
とコンソールにでてくる。

ただ、サーブレットのdoGetをdoPostに帰ると、エラーメッセージでこのGetメソッドは許されていませんと出る。また、レスポンスがうまく帰ってきていない。

elseで、System.out.println("failed");を書いたら、コンソールにfailedとなっていた。

try (
Response httpResponse = client.newCall(httpRequest).execute()) {
// レスポンスの処理
if (httpResponse.isSuccessful()) {
String responseBody = httpResponse.body().string();
//サーブレットのレスポンスに対して、取得したJSON形式のレスポンスボディを抽出
response.getWriter().println("Response: " + responseBody);
System.out.println("Success");
System.out.println(responseBody);
} else {
response.getWriter().println("Request failed with code: " + httpResponse.code());
System.out.println("failed");

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

サーブレットで作っているが、サーブレットとjspで作ってポストリクエスト、ポストでJSONが返ってくるようにしたほうがいい?そもそも方針を変えたほうがいいのか。お願いします。

該当のソースコード

java

1コード 2``` 3import java.io.IOException; 4import javax.servlet.ServletException; 5import javax.servlet.annotation.WebServlet; 6import javax.servlet.http.HttpServlet; 7import javax.servlet.http.HttpServletRequest; 8import javax.servlet.http.HttpServletResponse; 9 10import okhttp3.MediaType; 11import okhttp3.OkHttpClient; 12import okhttp3.Request; 13import okhttp3.RequestBody; 14import okhttp3.Response; 15 16@WebServlet("/YahooTestDemo") 17public class YahooTestDemo extends HttpServlet { 18 private static final long serialVersionUID = 1L; 19 20 public YahooTestDemo() { 21 super(); 22 } 23 24 protected void doGet(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 response.setContentType("text/html; charset=UTF-8"); 27 28 // JSONデータ 29 String json = 30 "{\r\n" 31 + " \"id\": \"dj00aiZpPTlFbHhqcnVzRWk3byZzPWNvbnN1bWVyc2VjcmV0Jng9N2M-\",\r\n" 32 + " \"jsonrpc\" : \"2.0\",\r\n" 33 + " \"method\" : \"jlp.keyphraseservice.extract\",\r\n" 34 + " \"params\" : {\r\n" 35 + " \"q\" : \"東京ミッドタウンから国立新美術館まで歩いて5分で着きます。\"\r\n" 36 + " }\r\n" 37 + "}"; 38 // System.out.println(json); 39 // メディアタイプとリクエストボディの作成 40 MediaType mediaType = MediaType.parse("application/json; charset=utf-8"); 41 RequestBody requestBody = RequestBody.create(mediaType, json); 42 // リクエストの作成 43 44 //ここでPOSTリクエストしている。 45 Request httpRequest = new Request.Builder() 46 .url("https://jlp.yahooapis.jp/KeyphraseService/V2/extract") 47 .post(requestBody)//POSTに設定している。 48 .build(); 49 50 System.out.println(httpRequest); 51 System.out.println(requestBody); 52 53 // OkHttpClientを使用してリクエストを送信 54 55 56 OkHttpClient client = new OkHttpClient(); 57 try ( 58 Response httpResponse = client.newCall(httpRequest).execute()) { 59 // レスポンスの処理 60 if (httpResponse.isSuccessful()) { 61 String responseBody = httpResponse.body().string(); 62 //サーブレットのレスポンスに対して、取得したJSON形式のレスポンスボディを抽出 63 response.getWriter().println("Response: " + responseBody); 64 System.out.println("Success"); 65 System.out.println(responseBody); 66 } else { 67 response.getWriter().println("Request failed with code: " + httpResponse.code()); 68 System.out.println("failed"); 69 } 70 } catch (Exception e) { 71 e.printStackTrace(); 72 } 73 } 74} 75 76``` 77

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

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

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

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

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

m.ts10806

2023/05/17 02:49

マークダウンのcodeがコードのあとの補足まで食ってしまってるので、調整してください。 コピー機能に全部引っ付いてきてしまいます
Konakona_

2023/05/17 02:54

すみません。わかりました。
m.ts10806

2023/05/17 04:09

伝え方が悪かったかもしれませんが、実際のコード以外は入らないようにしてください。 PCからだとわかりますが、コードブロックの右上のボタンでそのブロック内のテキストをコピーできるので、コード以外が入ってくると手元で確認する際に結構な手間になります。
shiketa

2023/05/17 06:52

> YahooApiを使ってキーワードをSystem.out.printlnでコンソールに提示したい 素人考えて申し訳ないのですが、結果をコンソールに提示(?)したいだけであれば、サーブレットなんか使わないほうが簡単なのではないでしょうか。mainメソッドを定義して、必要なパラメータは引数で受け取って、new Request.Builder()すればいいように思えます。 提示されたソースで問題を再現するにしてもそのほうがよっぽどラクですし。
jimbe

2023/05/17 08:41

>そもそも仕組みがわからない。 http が分からないということでしょうか。 shiketa さんの言われるように、最終的にサーブレットで動かすにしてもまずはコマンドプログラムとして『アクセスして結果を表示する』プログラムを作って、それが動作してからサーブレットにするほうが良いと思います。
guest

回答1

0

ベストアンサー

キーフレーズ抽出(V2)サンプル - Yahoo!デベロッパーネットワーク の Python のコードを java で再現する形と思われますが、 ID の設定の仕方等を間違えているようです。
まずはコマンドラインプログラムで試して確認してからのほうが良いと思います。

java

1import java.io.*; 2import java.net.URL; 3import java.net.URLConnection; 4import java.nio.charset.StandardCharsets; 5 6public class Sample12 { 7 private static final String APPID = "dj00aiZpPTlFbHhqcnVzRWk3byZzPWNvbnN1bWVyc2VjcmV0Jng9N2M-"; 8 private static final String APIURL = "https://jlp.yahooapis.jp/KeyphraseService/V2/extract"; 9 10 public static String post(String query) throws IOException { 11 String json = 12 "{\r\n" 13 + " \"id\": \"1234-1\",\r\n" 14 + " \"jsonrpc\" : \"2.0\",\r\n" 15 + " \"method\" : \"jlp.keyphraseservice.extract\",\r\n" 16 + " \"params\" : {\r\n" 17 + " \"q\" : \"" + query + "\"\r\n" 18 + " }\r\n" 19 + "}"; 20 21 URLConnection conn = new URL(APIURL).openConnection(); 22 conn.setDoOutput(true); 23 conn.setRequestProperty("Content-Type", "application/json"); 24 conn.setRequestProperty("User-Agent", "Yahoo AppID: " + APPID); 25 26 try(OutputStream out = conn.getOutputStream()) { 27 out.write(json.getBytes(StandardCharsets.UTF_8)); 28 } 29 30 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 31 try(InputStream in = conn.getInputStream()) { 32 byte[] buf = new byte[4096]; 33 for(int n; (n=in.read(buf))>=0; ) baos.write(buf, 0, n); 34 } 35 return baos.toString(StandardCharsets.UTF_8); 36 } 37 38 public static void main(String[] args) throws Exception { 39 String response = post("東京ミッドタウンから国立新美術館まで歩いて5分で着きます。"); 40 System.out.println(response); 41 } 42}
{"id":"1234-1","jsonrpc":"2.0","result":{"phrases":[{"score":100,"text":"東京ミッドタウン"},{"score":73,"text":"国立新美術館"},{"score":37,"text":"5分"}]}}

投稿2023/05/17 09:12

編集2023/05/17 09:56
jimbe

総合スコア12646

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問