3

I have an oauth connection - it works well with all other requests, but one: upload image for listings. Here is the code:

$connection = $this->getEtsyConnection();

$imageApiUrl = 'https://openapi.etsy.com/v2/listings/'.$listingId.'/images';
$mimeType = mime_content_type($source_file);
$filesize = filesize($source_file);

$params = ['@image' => ''.$source_file.';type='.$mimeType, 'rank'=>1, 'overwrite'=>true, 'listing_id'=>intval($listingId) ];
$header = [
            'Content-Type' => 'multipart/form-data',
          ];
try {
    if ( file_exists( $source_file ) ) {                                      
        $connection->fetch($imageApiUrl, $params, OAUTH_HTTP_METHOD_POST, $header);
        $json = $connection->getLastResponse();
        print_r( json_decode($json, true) );
    }                            
} catch (\OAuthException $e) {
    $json = $connection->getLastResponse();
    print_r( $json );
    print_r( $params );
    print_r( $header );
    print_r( $connection->debugInfo );
    print_r( $e->getMessage() );
}

But, the response is:

"headers_recv" => """
    HTTP/1.1 400 Bad Request\r\n
    Server: Apache\r\n
    Set-Cookie: uaid=uaid%3D02SXR92A2MZuWR1R4gUobQcxhvYR%26_now%3D1520781833%26_slt%3D2KFBr_F0%26_kid%3D1%26_ver%3D1%26_mac%3Dym0kPXlXkm33j2_65CRxbmbOVWQ5Cb7aM1aSZIWzihw.; expires=Thu, 11-Apr-2019 07:42:13 GMT; Max-Age=34186700; path=/; domain=.etsy.com; secure; HttpOnly\r\n
    X-Etsy-Request-Uuid: EurHmFgGFL9b1gGn4HleCGHmwRd3\r\n
    X-Error-Detail: The request body is too large\r\n
    Cache-Control: private\r\n
    Set-Cookie: zuaid=uaid%3D02SXR92A2MZuWR1R4gUobQcxhvYR%26_now%3D1520781833%26_slt%3DIpYGzeIk%26_kid%3D1%26_ver%3D1%26_mac%3DwMLVY4w5yOPNJ9uLZMSaJIbmYA1rbvw7eOoS25FRu30.; expires=Tue, 10-Apr-2018 15:23:53 GMT; Max-Age=2592000; path=/; domain=.etsy.com; secure; HttpOnly\r\n
    Set-Cookie: user_prefs=kJV1qV14EKx95Oq3MxB4K75uceRjZACCqKVenDA6Oq80J0eHZCKWAQA.; expires=Mon, 11-Mar-2019 15:23:53 GMT; Max-Age=31536000; path=/; domain=.etsy.com\r\n
    Content-Type: text/plain;charset=UTF-8\r\n
    Content-Length: 29\r\n
    Accept-Ranges: bytes\r\n
    Date: Sun, 11 Mar 2018 15:23:53 GMT\r\n
    Via: 1.1 varnish\r\n
    Connection: close\r\n
    X-Served-By: cache-hhn1532-HHN\r\n
    X-Cache: MISS\r\n
    X-Cache-Hits: 0\r\n
    X-Timer: S1520781834.592519,VS0,VE351
    "
"body_recv" => "The request body is too large"

What am I missing? The file is not uploaded, and the error above is received.

Zoli
  • 1,081
  • 1
  • 8
  • 28

2 Answers2

2

After many tries, I found a workaround using curl. I thought I should share it, so anyone with the same problem can use it.

$oauth = new OAuth($api_key, $api_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($access_token, $access_token_secret);

$url = "https://openapi.etsy.com/v2/listings/864452611/images";
$method = "POST";
$image_path = "/path/to/image.jpg";

$file = new \CURLFile($image_path, mime_content_type($image_path), basename($image_path));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => $file));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'method' => $method,
    'header' => 'Content-Type: multipart/form-data; boundary=' . microtime(true),
    'header' => 'Authorization: ' . $oauth->getRequestHeader($method, $url)
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);
print_r(json_decode($server_output, true));

curl_close ($ch); 
Nima Ch
  • 35
  • 1
  • 12
1

Have you tried using their PHP script:

// You must define the constants OAUTH_CONSUMER_KEY and OAUTH_CONSUMER_SECRET
// You must also assign values to the variables $access_token, $access_token_secret,
// $listing_id and $filename, and $mimetype.
// Your image file is assumed to be in the same directory as this code.

$oauth = new OAuth(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET);

$oauth->enableDebug();
$oauth->setToken($access_token, $access_token_secret);

try {
    $source_file = dirname(realpath(__FILE__)) ."/$filename";

    $url = "https://openapi.etsy.com/v2/listings/".$listing_id."/images";
    $params = array('@image' => '@'.$source_file.';type='.$mimetype);

    $oauth->fetch($url, $params, OAUTH_HTTP_METHOD_POST);

    $json = $oauth->getLastResponse();
    print_r(json_decode($json, true));

} catch (OAuthException $e) {
    // You may want to recover gracefully here...
    print $oauth->getLastResponse()."\n";
    print_r($oauth->debugInfo);
    die($e->getMessage());
}

I'm not familiar with PHP and am getting the same error message but from C#.

I ask because, if you get the same response using their PHP script (but with your values obviously) then you can raise a support request with them (Etsy Developer Support ) and point out that "it doesn't work". Etsy Support should then try the request at their end and if it works, you know you're doing something wrong (back to square one I know, but at least you know it should work...). But if they come back with "Ah, it's broken"...

My problem is that it used to work, and I have an example response from the call, but now it doesn't (I'm using RestSharp to make authenticated calls).

err1
  • 499
  • 9
  • 22
  • I allready contacted them and they dont know what the problem is... :( – Zoli Jun 07 '18 at 13:20
  • Thank you @Zoli. So they've acknowledged the problem but don't know what the cause is? Hmmm, I wonder if the problems started after they switched off support for TLS 1.0? If you're getting the error from a PHP point of view and I'm getting the same but from C#... – err1 Jun 07 '18 at 15:32
  • 3
    Got a response back from Etsy Support: "Recent updates have made it so these listings can now be managed via the API. However, all data must be sent through the Post Body. You can see an example here: https://www.etsy.com/developers/documentation/getting_started/oauth#section_authorized_put_post_requests" I'm not sure what this means but can anyone else can decipher their response and provide much needed clarity?? – err1 Sep 19 '18 at 10:37