前提・実現したいこと
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
拙い文章で申し訳ありません。 分かる事等ありましたら是非教えて頂けると非常に助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/20 00:36
2020/08/20 00:44
2020/08/20 00:57
2020/08/20 01:06
2020/08/20 01:17 編集
2020/08/20 01:23
2020/08/20 01:40
2020/08/20 01:55
2020/08/20 02:13