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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Q&A

1回答

972閲覧

<form>からsubmitするURLが変化して情報を取得できないのを回避する方法。

onoko

総合スコア41

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

0グッド

0クリップ

投稿2020/10/20 06:02

前提・実現したいこと

こんにちは。私は国立国会図書館の書誌情報取得システムの一つSRUに個人的なプログラムを通信接続しようとしています。皆さんに技術的なサポートを仰ぎたく存じております。

 私は自分の蔵書の登録と管理をできるようにするプログラムを作っています。そのプログラムにはある一冊の本のISBNコードをキー入力することのみで自動的にその題名、著者名、発行所、刊行日等が、国会図書館の書誌情報取得システムであるSRUからXMLデータで取り込む機能を付ける予定です。

このような機能を実装中に以下のエラーメッセージが発生しました。

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

中途までそのプログラムを作ったのちに、一つの問題が生じました。私は試しに国会図書館のSRUに対して、HTMLのformタグのaction属性に以下のような正しいURLを装填してsubmitしてみました。(9784865101911は実在するisbnです。)

http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&query=isbn=9784865101911

しかしそれは失敗し,戻されてくる筈のその本のXMLデータを取得できませんでした。
その時下記のようなURLがアドレスバーに表示されました。これは上述の正しい完全なURLの一部が欠けた不完全なURLです。

http://iss.ndl.go.jp/api/sru?isbn=9784865101911

私は、自分ではSRUに完全なURLをsubmitしたつもりなのにかかわらず、不完全なURLが送られて、XMLデータが獲得できなかったのではないかと想像しています。私にはなぜURLの一部が欠けるのか判りません。そこで皆さんにお願いなのですが、どうか国会図書館のSRUに完全なURLを送って、XMLデータを取得できるための方法を御教示下さい。
**
私には完全なURLのうちの、operation と searchRetrieve&query の間の = および searchRetrieve&query と isbn の間の = とが、代入演算子として働き、最後に式全体が評価されて isbn= なったかのようにも想像されます。

一方で正しい完全なURLを直接アドレスバーに入力して送信すると、国会図書館のシステムのSRUに届いて、その一冊の本のXMLデータが正しく取得されています。だから、上述の完全なURLにまちがいはないのです。

エラーメッセージ
`An error ocurred. operation is not searchRetrive.(空のXMLデータに表示される。)

該当のソースコード

言語
Java,JavaScript

ソースコード

•画面JSP :seachBook.jsp

<!-- <%@page language=”java” contentType=”text/html; charset=UTF-8” pageEncoding=”UTF-8”%> <!DOCTYPE html> <html> <head> <meta charset=”UTF-8”> <title蔵書検索登録画面</title> </head> <body> <h1>蔵書検索登録</h1> <form action=”http://iss.ndl.go.jp” name=”seachForm” onsubmit=”changeAction()” method=”get” id=”formId”> ISBNコード:<input type=”text” name=”isbn” id=”textId”> </form> <script> Function changeAction(){ let formObject = document.getElementById(‘formId’); formObject.action=”http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&query=isbn=” + document.getElement.ById(‘textId’).value; } </script> </body> </html> -->

●リクエストに応えて画面JSPにフォワードするサーブレット。:collectBook.java
package original;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/CollectBook")
public class CollectBook extends HttpServlet {
private static final long serialVersionUID = 1L;

public CollectBook() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardPath = null; forwardPath = "/WEB-INF/jsp/searchBook.jsp"; RequestDispatcher dispatcher =request.getRequestDispatcher(forwardPath); dispatcher.forward(request,response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }

}

試したこと

URL上の=にエスケープが必要なのかと思いをエンコードして%3D%0D%0Aにかえてみましたが、結果はおなじくsubmit後アドレスバーに一部が欠けたURLが表示され空のXMLデータしか取得できなくて上記と変わらぬエラーメッセージが出ました。

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

ブラウザ:Google Chrome OS:Windows10
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

国立国会図書館サーチのAPI仕様の概要を見ると、リクエスト例に

2018年以降に出版されていて、タイトルに「桜」を含むものを検索する(SRU)

https://iss.ndl.go.jp/api/sru?operation=searchRetrieve&maximumRecords=10&query=title%3d%22%E6%A1%9C%22%20AND%20from%3d%222018%22
結果:こちら
※CQLは、title="桜" AND from="2018"となります。ただし、実際のリクエストURLは、これをUTF-8にてエンコードしたものをqueryに付加したURLです。(「title="桜" AND from="2018"」をエンコードしたものは、「title%3d%22%E6%A1%9C%22%20AND%20from%3d%222018%22」です。)

とありますので、

URL上の=にエスケープが必要なのかと思いをエンコードして%3D%0D%0Aにかえてみましたが、

とされていますが、エスケープが必要なのは、query=より後ろの文字列のみで、UTF-8にてエンコードすると=%3dになります(%0d%0aは改行コードのようですがツールなどで変換時に紛れていませんか?)。仕様を詳細に読んではいないので、isbn番号をダブルクォートで囲む必要がないのかは調べてみてください。

API仕様書

投稿2020/10/20 07:59

KoichiSugiyama

総合スコア3041

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

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

onoko

2020/10/20 09:04

さっそくのご指導ありがとうございます。ご指摘の通り%0d%0aは紛れ込んだ余計なものと思われます。query以下のisbnについた=を%3dに変えてプログラムを動かしてみましたが結果は前と同じエラーメッセージと空のXMLデータが返るのみで折角ですが変化はありませんでした。isbn番号は国会図書館の担当者から検索項目が1つのみの時はダブルクオートで囲む必要はないと短い連絡があり付けなかったのでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問