2016-05-13 17 views
0

Ich versuche, GuzzleHttp mit Magento zu verwenden, um meinen Produktkatalog zu aktualisieren.GuzzleHttp gib mir 500 Fehler

Ich benutze einen Pool Anforderungsdaten aus der Datenbank zu bekommen, und ich versuche, sie in magento trought API

$apiUrl = 'http://xxx.xxxxx.xxx'; 

$middleware = new Oauth1([ 
    'consumer_key' => '-------------------------------', 
    'consumer_secret' => '-------------------------------', 
    'token'   => '-------------------------------', 
    'token_secret' => '-------------------------------' 
]); 
$stack->push($middleware); 


$client = new Client(); 

$clientUpdate = new Client([ 
    'base_uri' => $apiUrl, 
    'handler' => $stack, 
    'auth' => 'oauth' 
]); 

$mapper = new JsonMapper(); 



$requests = function ($total) { 
    $uri = 'http://10.0.0.114:15021/myservice'; 

    for ($i = 1; $i <= $total; $i++) { 
     yield new Request('GET', $uri.$i); 
    } 
}; 

$pool = new Pool($client, $requests(3), [ 
    'concurrency' => 3, 
    'fulfilled' => function ($response, $index) { 

     global $clientUpdate, $mapper; 

     $productsArray = $mapper->mapArray(
      json_decode($response->getBody($asString = TRUE)), new ArrayObject(), 'ProductGo' 
     ); 

     $product = new Product(); 
     $stock = new StockData(); 

     foreach($productsArray as &$value){ 

      $product->type_id = "simple"; 
      $product->attribute_set_id = 4; 
      $product->sku = $value->xxxxxxxxxxxxxxx; 
      $product->weight = 1; 
      $product->name = $value->xxxxxxxx; 
      $product->price = $value->xxxxxxxx; 
      $product->status = 1; 
      $product->visibility =4; 
      $product->tax_class_id = 4; 
      $product->description = $value->xxxxxxx; 
      $product->short_description = $value->xxxxxx; 

      $stock->qty = $value->xxxxx; 
      $stock->min_qty = "0"; 
      $stock->is_qty_decimal = 0; 
      $stock->is_in_stock = 1; 

      $product->stock_data = (object) array_filter((array) $stock); 

      $productIn = (object) array_filter((array) $product); 
      try{ 
       $response = $clientUpdate->request('POST', '/api/rest/products', ['json' => json_encode($productIn)]); 

       echo $response; 
      }catch (RequestException $e) { 
       echo GuzzleHttp\Psr7\str($e->getRequest()); 
       if ($e->hasResponse()) { 
        echo GuzzleHttp\Psr7\str($e->getResponse()); 
       } 
      } 

     } 
    }, 
    'rejected' => function ($reason, $index) { 
     echo $reason; 
    }, 
]); 

// Initiate the transfers and create a promise 
$promise = $pool->promise(); 

// Force the pool of requests to complete. 
$promise->wait(); 

Pool Anfrage funktioniert ok zu veröffentlichen. Wenn ich debuggen werde ich einen Haltepunkt setzen, wo ich eine Anfrage machen, aber nachdem ich immer den gleichen Fehler

PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\ServerException' with message 'Server error: 500' in /home/xxxxxxxxxxx/PhpstormProjects/xxxxxxxxxxx/vendor/guzzlehttp/guzzle/src/Middleware.php:68 
Stack trace: 
#0 /home/xxxxxxxxxxx/PhpstormProjects/xxxxxxxxxxx/vendor/guzzlehttp/promises/src/Promise.php(199): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Response)) 
#1 /home/xxxxxxxxxxx/PhpstormProjects/xxxxxxxxxxx/vendor/guzzlehttp/promises/src/Promise.php(152): GuzzleHttp\Promise\Promise::callHandler(1, Object(GuzzleHttp\Psr7\Response), Array) 
#2 /home/xxxxxxxxxxx/PhpstormProjects/xxxxxxxxxxx/vendor/guzzlehttp/promises/src/TaskQueue.php(60): GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}() 
#3 /home/xxxxxxxxxxx/PhpstormProjects/xxxxxxxxxxx/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(96): GuzzleHttp\Promise\TaskQueue->run() 
#4 /home/xxxxxxxxxxx/PhpstormProjects/xxxxxxxxxxx/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(123): GuzzleHttp\Handler\CurlMultiHandler->tick() 
#5 /home/xxxxxxxxxxx/PhpstormPr in /home/xxxxxxxxxxx/PhpstormProjects/xxxxxxxxxxx/vendor/guzzlehttp/guzzle/src/Middleware.php on line 68 

Ich kann nicht verstehen, was das Problem ist, ich habe versucht, mit Postbote dieser json als Produkt zu schreiben und es funktioniert.

Irgendwelche Vorschläge ???

+1

Die Tatsache, dass ein 500-Fehler erhält verputzen bedeutet, dass ein schwerwiegender Fehler in der API aufgetreten. Sie müssen die Fehlerprotokolle auf dem Server überprüfen, auf dem die API ausgeführt wird, um zu wissen, was passiert. – Tchoupi

Antwort

0

http://docs.guzzlephp.org/en/latest/request-options.html#jso

Zusammenfassung:

Die json Option verwendet wird, um leicht JSON codierte Daten wie der Körper einer Anforderung hochladen. Ein Content-Type-Header der Anwendung/json wird hinzugefügt, wenn kein Content-Type-Header bereits in der Nachricht vorhanden ist.

Hier ist ein Beispiel dafür, wie die Kopfzeile auf Anfrage einzurichten:

$client->request('POST', $url, [ 
    'headers' => [ 
     'Accept'  => 'application/json', 
    ], 
    'body' = $body 
]); 
+1

Das bedeutet, dass bei Verwendung der Option "json" der Inhaltstyp automatisch auf "application/json" gesetzt wird, wenn er nicht bereits festgelegt wurde. Also hier ist wirklich kein Problem. – Tchoupi