Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

seeing the response of any upsertList() call #176

Open
johamm opened this issue Apr 3, 2020 · 5 comments
Open

seeing the response of any upsertList() call #176

johamm opened this issue Apr 3, 2020 · 5 comments

Comments

@johamm
Copy link

johamm commented Apr 3, 2020

I'm using upsertList() in a number of areas (ProductModel, Category, AttributeOptions etc) and when I run it, I'm not getting a response. How would I know what item has been created/updated successfully and which have failed? Reading the API documentation suggests you should...

For example: https://api.akeneo.com/php-client/resources.html#upsert-a-list-of-product-models

foreach ($responseLines as $line) {
        echo $line['line'];
        echo $line['identifier'];
        echo $line['status_code'];
        if (isset($line['message'])) {
            echo $line['message'];
        }
    }

When I try this, there's nothing showing. When I print_r($responseLines) there's only the following:

Akeneo\Pim\ApiClient\Stream\UpsertResourceListResponse Object
(
    [bodyStream:protected] => GuzzleHttp\Psr7\Stream Object
        (
            [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #131
            [size:GuzzleHttp\Psr7\Stream:private] => 
            [seekable:GuzzleHttp\Psr7\Stream:private] => 1
            [readable:GuzzleHttp\Psr7\Stream:private] => 1
            [writable:GuzzleHttp\Psr7\Stream:private] => 1
            [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
            [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                (
                )
        )

    [streamReader:protected] => Akeneo\Pim\ApiClient\Stream\LineStreamReader Object
        (
        )

    [lineNumber:protected] => 1
    [line:protected] => 
)
@timonburkard
Copy link

I agree, it does not work on my side as well.

I tried the following, which updates the product values correctly. However, I am not getting an output with the suggested foreach loop:

$responseLines = $api->getProductApi()->upsertList(
    [
        [
            'identifier' => 'TCK-171',
            "values" => [
                'Mar_StatusComment' => [
                    [
                        'data' => "Test 123",
                        'locale' => 'en_US',
                        'scope' => null,
                    ],
                ],
            ],
        ],
        [
            'identifier' => 'TCK-170',
            "values" => [
                'Mar_StatusComment' => [
                    [
                        'data' => "Test 12345",
                        'locale' => 'en_US',
                        'scope' => null,
                    ],
                ],
            ],
        ]
    ]);


foreach ($responseLines as $line) {
    echo $line['line'];
    echo $line['identifier'];
    echo $line['status_code'];
    if (isset($line['message'])) {
        echo $line['message'];
    }
}

@LevFlavien
Copy link
Contributor

Hi @johamm @timonburkard ,
UpsertResourceListResponse is iterable. The data is stored in the bodyStream property and the object needs to be iterated in order for each line to be decoded.

@timonburkard What's the output if you do var_dump($line) inside the foreach ? I have:

array(3) {
  'line' =>
  int(1)
  'identifier' =>
  string(8) "TCK-171"
  'status_code' =>
  int(204) // 201 if created, 204 if updated
}

And example if any line produces an error

array(5) {
  'line' =>
  int(2)
  'identifier' =>
  string(7) "noexist"
  'status_code' =>
  int(422)
  'message' =>
  string(106) "The descriptions attribute does not exist in your PIM. Check the expected format on the API documentation."
  '_links' =>
  array(1) {
    'documentation' =>
    array(1) {
      'href' =>
      string(62) "http://api.akeneo.com/api-reference.html#patch_products__code_"
    }
  }
}

So it seems ok my end with client v7 to v9, on a PIM v6.

@LevFlavien LevFlavien self-assigned this May 17, 2022
@timonburkard
Copy link

Hi @LevFlavien,

Thanks for your reply. I tried your suggestion as follows:

$responseLines = $api->getProductApi()->upsertList(
    [
        [
            'identifier' => 'TCK-171',
            "values" => [
                'Mar_StatusComment' => [
                    [
                        'data' => "Test 2022-02-24",
                        'locale' => 'en_US',
                        'scope' => null,
                    ],
                ],
            ],
        ],
        [
            'identifier' => 'TCK-170',
            "values" => [
                'Mar_StatusComment' => [
                    [
                        'data' => "Test 2022-02-24",
                        'locale' => 'en_US',
                        'scope' => null,
                    ],
                ],
            ],
        ]
    ]);


print("*** responesLines ***\n");
var_dump($responseLines);
print("\n\n");

$i = 0;
foreach ($responseLines as $line) {
    print("*** line: " . $i . " ***\n");
    var_dump($line);
    print("\n\n");
    ++$i;
}

The products are updated correctly:
image

However, I still cannot iterate properly through the response. Output on console:

*** responesLines ***
object(Akeneo\Pim\ApiClient\Stream\UpsertResourceListResponse)#66 (4) {
  ["bodyStream":protected]=>
  object(GuzzleHttp\Psr7\Stream)#68 (7) {
    ["stream":"GuzzleHttp\Psr7\Stream":private]=>
    resource(177) of type (stream)
    ["size":"GuzzleHttp\Psr7\Stream":private]=>
    NULL
    ["seekable":"GuzzleHttp\Psr7\Stream":private]=>
    bool(true)
    ["readable":"GuzzleHttp\Psr7\Stream":private]=>
    bool(true)
    ["writable":"GuzzleHttp\Psr7\Stream":private]=>
    bool(true)
    ["uri":"GuzzleHttp\Psr7\Stream":private]=>
    string(10) "php://temp"
    ["customMetadata":"GuzzleHttp\Psr7\Stream":private]=>
    array(0) {
    }
  }
  ["streamReader":protected]=>
  object(Akeneo\Pim\ApiClient\Stream\LineStreamReader)#67 (0) {
  }
  ["lineNumber":protected]=>
  int(1)
  ["line":protected]=>
  NULL
}


*** line: 0 ***
NULL

I also checked composer to ensure I am on the latest version:

PS C:\Users\t.burkard\git\writer-test> composer show
akeneo/api-php-client             v9.0.0  Akeneo PIM client for the API
guzzlehttp/guzzle                 7.4.2   Guzzle is a PHP HTTP client library
guzzlehttp/promises               1.5.1   Guzzle promises library
guzzlehttp/psr7                   2.2.1   PSR-7 message implementation that also provides common utility methods
http-interop/http-factory-guzzle  1.2.0   An HTTP Factory using Guzzle PSR7
php-http/discovery                1.14.1  Finds installed HTTPlug implementations and PSR-7 message factories
php-http/guzzle7-adapter          1.0.0   Guzzle 7 HTTP Adapter
php-http/httplug                  2.3.0   HTTPlug, the HTTP client abstraction for PHP
php-http/message-factory          v1.0.2  Factory interfaces for PSR-7 HTTP Message
php-http/multipart-stream-builder 1.2.0   A builder class that help you create a multipart stream
php-http/promise                  1.1.0   Promise used for asynchronous HTTP requests
psr/http-client                   1.0.1   Common interface for HTTP clients
psr/http-factory                  1.0.1   Common interfaces for PSR-7 HTTP message factories
psr/http-message                  1.0.1   Common interface for HTTP messages
ralouphie/getallheaders           3.0.3   A polyfill for getallheaders.
symfony/deprecation-contracts     v3.0.1  A generic function and convention to trigger deprecation notices
symfony/polyfill-ctype            v1.25.0 Symfony polyfill for ctype functions
symfony/yaml                      v6.0.3  Loads and dumps YAML files

My PIM version is EE v6.0.21.

@LevFlavien
Copy link
Contributor

LevFlavien commented May 24, 2022

Weird, it works on my side with the same PIM version.

Could you please check whether the problem is on PIM or Client side, by requesting without using the client?

For example here's a curl, complete <PIM_URL> and <YOUR_TOKEN> variables.

curl -X PATCH <PIM_URL>api/rest/v1/products \
        -H "Content-Type: application/vnd.akeneo.collection+json" \
        -H "Authorization: Bearer <YOUR_TOKEN>" \
        -d $'{"identifier": "TCK-171", "values": {"Mar_StatusComment": [{"data": "Test 2022-02-24", "locale": "en_US", "scope": null}]}}\n{"identifier": "TCK-170", "values": {"Mar_StatusComment": [{"data": "Test 2022-02-24", "locale": "en_US", "scope": null}]}}'

expected output:

{"line":1,"identifier":"TCK-171","status_code":204}
{"line":2,"identifier":"TCK-170","status_code":204}

@timonburkard
Copy link

@LevFlavien it works with curl:

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants