作成した在庫ファイル(CSV)を在庫アップロードAPI(YahooショッピングAPI)を使用して
アップロードしようとしていますがエラー(CSVファイルが指定されていません)となり,
アップロードできません。
「file」部分が正常にPOSTできていないのでは?と思い,色々調査&テストをしましたが解決しません。
全く見当違いのことを調べている可能性もありますが、他にもっと有効な方法があれば、
PHPであれば特にcURLでのPOST送信にはこだわりません。
・在庫アップロードAPI実行時(リクエストの時)のボディの内容を取得&表示できないでしょうか?
他のサイト(※参考)を参照するとリクエスト時のボディの内容が記載されています。
この内容を表示できれば,なにかわかるのではないか?と思っています。
恐らく※参考のようなリクエストができてないと考えています。
・fileの指定が問題のように考えていますが,指定方法は問題ないのでしょうか?
※マニュアルとは少し違いますが,※参考(PHPでフォームを使わずにCSVファイルをPOST送信する方法)を
元に設定しました。
・在庫アップロードAPIの動作事例(こうしたら動いたよ的な事例)はないでしょうか?
・その他おかしな点があれば,教えて下さい。
よろしくお願い致します。
※MacBook Proにnginx,PHPをインストールして実行しています。
###エラーメッセージ
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Message><![CDATA[CSVファイルが指定されていません。]]></Message> <Detail></Detail> <Code>st-03001</Code> </Error>
###該当のソースコード
PHP
1echo "---------------------------------------" . "<br>"; 2echo "----- 在庫CSVアップロード処理 開始-----" . "<br>"; 3echo "---------------------------------------" . "<br>"; 4echo "----- 在庫アップロードAPI (uploadStockFile) 開始 -----" . "<br>"; 5// テスト環境 6$url = "https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/uploadStockFile"; 7//--- 8echo "----- リクエスト(uploadStockFile) 開始 -----" . "<br>"; 9// アップロードファイル ※ファイルは存在しています 10$filepath = "/yahooupload/yahooupload.csv"; 11$filename = "yahooupload.csv"; 12$filesize = filesize("/yahooupload/yahooupload.csv"); 13// アクセストークンの認証については他の処理(API)で成功しているので、問題ないと思います 14$header = [ "Authorization:Bearer " . <アクセストークン>,"Content-Type: multipart/form-data" ]; 15$data = [ 'file' => "@{$filepath};filename={$filename};type=text/comma-separated-values;size={$filesize}" ]; 16//--- 17echo "------------------------------------------------" . "<br>"; 18var_dump($header); 19var_dump($data); 20echo "------------------------------------------------" . "<br>"; 21$ch = curl_init($url . '?seller_id=' . セラーID); 22curl_setopt_array($ch,[ CURLOPT_POST => TRUE,CURLOPT_RETURNTRANSFER => TRUE,CURLOPT_HTTPHEADER => $header,CURLOPT_VERBOSE => TRUE,CURLOPT_HEADER => TRUE,CURLINFO_HEADER_OUT => TRUE,CURLOPT_TIMEOUT => 600,CURLOPT_POSTFIELDS => $data ]); 23// 24$requestresult = curl_exec($ch); 25// 26echo "----- リクエストヘッダ-----" . "<br>"; 27echo curl_getinfo($ch,CURLINFO_HEADER_OUT) . " <br>"; 28echo "----- リクエスト結果-----" . " <br>"; 29var_dump(curl_getinfo($ch)); 30echo "------------------------------------------------" . "<br>"; 31var_dump($requestresult); 32echo "------------------------------------------------" . "<br>"; 33// 34curl_close($ch);
###実行結果
※var_dump($header)の結果
array (size=2)
0 => string 'Authorization:Bearer <アクセストークン>'
1 => string 'Content-Type: multipart/form-data' (length=33)
※var_dump($data)の結果
array (size=1)
'file' => string '@/yahooupload/yahooupload.csv;filename=yahooupload.csv;type=text/comma-separated-values;size=1714' (length=127)
----- リクエストヘッダ-----
POST /ShoppingWebService/V1/uploadStockFile?seller_id=セラーID HTTP/1.1 Host: test.circus.shopping.yahooapis.jp Accept: / Authorization:Bearer <アクセストークン> Content-Length: 266 Expect: 100-continue Content-Type: multipart/form-data; boundary=------------------------b0d226c113dedb80
----- リクエスト結果-----
※var_dump(curl_getinfo($ch))の結果
array (size=27)
'url' => string 'https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/uploadStockFile?seller_id=セラーID (length=104)
'content_type' => string 'application/xml' (length=15)
'http_code' => int 400
'header_size' => int 489
'request_size' => int 935
'filetime' => int -1
'ssl_verify_result' => int 0
'redirect_count' => int 0
'total_time' => float 0.443764
'namelookup_time' => float 0.046427
'connect_time' => float 0.074047
'pretransfer_time' => float 0.148032
'size_upload' => float 266
'size_download' => float 183
'speed_download' => float 412
'speed_upload' => float 599
'download_content_length' => float 183
'upload_content_length' => float 266
'starttransfer_time' => float 0.176012
'redirect_time' => float 0
'redirect_url' => string '' (length=0)
'primary_ip' => string ※「省略」
'certinfo' =>
array (size=0)
empty
'primary_port' => ※「省略」
'local_ip' => string ※「省略」
'local_port' => ※「省略」
'request_header' => string 'POST /ShoppingWebService/V1/uploadStockFile?seller_id=セラーID HTTP/1.1
Host: test.circus.shopping.yahooapis.jp
Accept: /
Authorization:Bearer <アクセストークン>
Content-Length: 266
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------b0d226c113dedb80
' (length=935)
※var_dump($requestresult)の結果
'HTTP/1.1 100 Continue
HTTP/1.1 400 Bad Request
Date: Wed, 27 Dec 2017 10:25:15 GMT
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Content-Length: 183
Content-Type: application/xml
Age: 0
Connection: keep-alive
###参考
在庫アップロードAPI-デベロッパーネットワークトップ -ショッピング※マニュアル
https://developer.yahoo.co.jp/webapi/shopping/uploadStockFile.html
PHPでフォームを使わずにCSVファイルをPOST送信する方法-teratail
https://teratail.com/questions/24335
商品アップロードAPIで「Typeが指定されていません。」のメッセージが表示される解決方法-Qiita
https://qiita.com/kagen/items/ba67b86d05a0c8e82267