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

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

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

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Java

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

POST

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

API

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

Q&A

解決済

1回答

1275閲覧

YahooAPI 商品登録APIでデータの送信が上手くいかない。

kait0520

総合スコア1

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Java

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

POST

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

API

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

0グッド

0クリップ

投稿2020/08/18 03:01

編集2020/08/20 05:07

前提・実現したいこと

JavaにてYahooShoppingAPIの商品登録APIを利用した
商品登録クラスの作成がしたい

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

登録処理が成功せず、レスポンスコードに400エラーが記録されている。

InputStream c = connection.getInputStream()で発生したエラーコード。

error

1java.io.IOException: Server returned HTTP response code: 400 for URL: https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/editItem 2 at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 3 at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 4 at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 5 at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) 6 at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1969) 7 at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1964) 8 at java.base/java.security.AccessController.doPrivileged(Native Method) 9 at java.base/sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1963) 10 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1531) 11 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515) 12 at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250) 13 at servlet.api.EditItem.executePost(EditItem.java:96) 14 at servlet.api.EditItem.editItem(Unknown Source) 15 at servlet.ProductEntry.doPost(ProductEntry.java:115) 16 at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) 17 at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 18 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 19 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 20 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 21 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 22 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 23 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) 24 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 25 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) 26 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 27 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 28 at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) 29 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 30 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 31 at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) 32 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 33 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) 34 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) 35 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 36 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 37 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 38 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 39 at java.base/java.lang.Thread.run(Thread.java:834) 40Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/editItem 41 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1919) 42 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515) 43 at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527) 44 at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:334) 45 at servlet.api.EditItem.executePost(EditItem.java:93) 46 ... 26 more

該当のソースコード

java

1import java.io.BufferedWriter; 2import java.io.OutputStreamWriter; 3import java.io.UnsupportedEncodingException; 4import java.net.HttpURLConnection; 5import java.net.URL; 6import java.net.URLEncoder; 7 8import org.apache.commons.lang3.StringUtils; 9 10import productDate.structure.ProductInsertForm; 11 12/** 13 * 商品登録APIを利用して 商品を登録する。 14 */ 15public class EditItem { 16 17 public void editItem(ProductInsertForm form,<アクセストークン>) throws Exception { 18 19 String requestString = ""; 20 String orderSearch = "https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/editItem"; 21 String sellerId = "<ストアアカウント>"; 22 String sellerIdUtf8 =""; 23 24 try { 25 //ストアアカウントをUTF-8にエンコードする 26 sellerIdUtf8 = URLEncoder.encode(sellerId, "UTF-8"); 27 requestString = "seller_id=" + sellerIdUtf8 +"&"; 28 29 //フォームデータをUTF-8にエンコード 30 requestString = dataSet(requestString, form); 31 32 33 executePost(orderSearch , requestString, <アクセストークン>); 34 35 } catch (Exception e) { 36 e.printStackTrace(); 37 throw e; 38 } 39 40 } 41 42 43 /** 44 * 商品登録APIを動作させる。 45 */ 46 private void executePost(String requestRrl,String request, <アクセストークン> ) throws Exception { 47 try { 48 URL url = new URL(requestRrl); 49 HttpURLConnection connection = null; 50 try { 51 52 connection = (HttpURLConnection) url.openConnection(); 53 //アウトプット可能 54 connection.setDoOutput(true); 55 //入力可能 56 connection.setDoInput(true); 57 //cache無し 58 connection.setUseCaches(false); 59 connection.setRequestMethod("POST"); 60 61 //Content-Lengthの手動記載 62 byte[] bytes = request.getBytes(); 63 connection.setInstanceFollowRedirects(false); 64 String texta = String.valueOf(bytes.length); 65 connection.setFixedLengthStreamingMode(bytes.length); 66 connection.setFixedLengthStreamingMode((long)bytes.length); 67 68 connection.setRequestProperty("Host", "test.circus.shopping.yahooapis.jp"); 69 connection.setRequestProperty("Authorization", "Bearer " + <アクセストークン>); 70 71 //Content-Typeの設定 72 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 73 74 connection.connect(); 75 76 OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); 77 BufferedWriter writer = new BufferedWriter(osw); 78 writer.write(request); 79 writer.flush(); 80 81 //レスポンスコード確認用 82 int a = connection.getResponseCode(); 83 String b = connection.getResponseMessage(); 84 InputStream c = connection.getInputStream(); 85 86 if (connection != null) { 87 connection.disconnect(); 88 } 89 } catch (Exception e) { 90 e.printStackTrace(); 91 throw e; 92 } 93 } catch (Exception e) { 94 e.printStackTrace(); 95 throw e; 96 } 97 } 98 99 100/** 101 * 入力Formから取得したデータを確認し、データが存在する場合UTF-8でエンコードして接続する 102 */ 103 public String dataSet(String requestString, ProductInsertForm form) throws UnsupportedEncodingException { 104 105 String textEdit = ""; 106 if(!StringUtils.isEmpty(form.getItemCode())){ 107 textEdit = URLEncoder.encode(form.getItemCode(), "UTF-8"); 108 109 requestString = requestString + "item_code=" + textEdit +"&"; 110 } 111 if(!StringUtils.isEmpty(form.getPath())){ 112 String[] date = form.getPath().split(",",0); 113 String path = ""; 114 if(date.length == 1) { 115 textEdit = URLEncoder.encode(form.getPath(), "UTF-8"); 116 path = textEdit; 117 }else { 118 for(String setDate :date) { 119 textEdit = URLEncoder.encode(setDate, "UTF-8") + "%0D%0A"; 120 path = path + textEdit; 121 } 122 } 123 124 requestString = requestString + "path=" + path +"&"; 125 } 126 if(!StringUtils.isEmpty(form.getName())){ 127 textEdit = URLEncoder.encode(form.getName(), "UTF-8"); 128 129 requestString = requestString + "name=" + textEdit +"&"; 130 } 131 132 if(!StringUtils.isEmpty(form.getPrice())){ 133 textEdit = URLEncoder.encode(form.getPrice(), "UTF-8"); 134 135 requestString = requestString + "price=" + textEdit +"&"; 136 } 137 138 ~~~~~~可読性のため、処理省略~~~~~~ 139 140 if(!StringUtils.isEmpty(form.getIsDrug())){ 141 textEdit = URLEncoder.encode(form.getIsDrug(), "UTF-8"); 142 143 requestString = requestString + "is_drug=" + textEdit; 144 } 145 146 return requestString; 147 } 148} 149

###分からない事
① Javaを利用した場合の商品登録APIの記載方法
② 商品登録APIでのデータ送信に必要なデータ形式(参考にした物ではXML形式で送信していた)

試したこと

① Content-Length要素の記載
② https://teratail.com/questions/34815 を参考にPOST要素の作成
③ request部分を必須アイテムだけにして送信処理
④ connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");の加筆
⑤ connection.setInstanceFollowRedirects(false) を使用したContent-Lenghtの手動調整 SCに記載を追加。
⑥ requestStringの内容の修正
⑦ getRequestMessage()の追加 結果は Bad Request
⑧ connection.getInputStream(); での中身の確認の追加、そこでCatchに飛ばされる。

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

Java jdk-11.0.7
Tomcat 9.0

拙い文章で申し訳ありません。 分かる事等ありましたら是非教えて頂けると非常に助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

connection.getResponseMessage()を確認するとエラーの原因がわかるかもしれません。

とりあえず、クエリパラメータではないのでseller_idの前の?は不要だと思います。

java

1requestString = "?seller_id=" + sellerIdUtf8 +"&";

投稿2020/08/20 00:16

attercop

総合スコア246

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

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

kait0520

2020/08/20 00:36

回答ありがとうございます! connection.getResponseMessage()を実際に試してみましたが、 Bad Request と帰ってくるだけで具体的に何がいけないのかは分かりませんでした・・・ 実際にクエリとして繋ぐ訳ではないので?は不要なのですね、実際に試してから内容の編集をさせて頂きました。
attercop

2020/08/20 00:44

レスポンスボディにエラーの内容が出力されている場合もあるので、connection.getInputStream()の内容を確認してみると良いかもしれません。
kait0520

2020/08/20 00:57

回答ありがとうございます! connection.getInputStream()を追加して、エラーコードを追記しました。 そもそも繋げる事に失敗しているからInputStreamでエラーはいちゃう感じなのでしょうか・・・
attercop

2020/08/20 01:06

APIへ送るパラメータの問題ではなくてPOSTリクエスト自体が正しくないってことだと思います。 質問のソースには記載がないですが、Content-Lengthは指定しているのですよね?
kait0520

2020/08/20 01:17 編集

回答ありがとうございます! byte[] bytes = request.getBytes(); connection.setInstanceFollowRedirects(false); connection.setFixedLengthStreamingMode(bytes.length); connection.setFixedLengthStreamingMode((long)bytes.length); を加筆してあります。 こちらでは記載方法として間違っているでしょうか? Content-LengthとContent-Typeについて加筆しました。
attercop

2020/08/20 01:23

すいません、エラーの取り方まちがってました。 connection.getInputStream()ではなくconnection.getErrorStream()です。 このストリームの内容を見れば何がおかしいかわかると思います。
kait0520

2020/08/20 01:40

回答ありがとうございます! BufferedReader brerr = new BufferedReader(new InputStreamReader(c)); while((str = brerr.readLine()) != null) { System.out.println(str); } を使用して中身を確認したところ <?xml version="1.0" encoding="UTF-8" ?> <Error> <Message><![CDATA[在庫初期設定を上限なしで設定されているため更新ができません。]]></Message> <Detail></Detail> <Code>it-01202</Code> </Error> というメッセージを回収する事が出来ました!
attercop

2020/08/20 01:55

よかったです。 あとはAPIのパラメータを調整すれば上手くいきそうですね。
kait0520

2020/08/20 02:13

登録に成功しました! Java側の設定は間違っていなかったようで、Yahoo!のストアクリエイターProの設定の方に問題があったようです。 長時間優しく教えて下さり、本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問