【问题标题】:PHP Curl PUT stopps at curl_execPHP Curl PUT 在 curl_exec 处停止
【发布时间】:2021-11-16 01:36:28
【问题描述】:

我尝试通过 PUT-Request 更新产品,但程序在 curl_exec 处停止执行。 因为我什至没有收到错误或任何东西,我有点迷失在黑暗中。 我使用这个站点生成了代码:https://reqbin.com/ 它适用于我的 GET 和 POST 请求,但 PUT 似乎不起作用。 当我使用该站点发送 PUT-Request 时,它确实有效,但不适用于我的本地工作区。

这是我的代码:

public function updateProduct($product) {
        $id = $product->{"id"};
        $sku = $product->{"sku"};
        $infiniteInventory = $product->{"infiniteInventory"};
        $images = $product->{"images"};
        $category = $product->{"category"};
        $adaptivePrice = $product->{"adaptivePrice"};
        $manualPrice = $product->{"manualPrice"};
    
        $url = "https://system-url.de/myId/products/".$id;

        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_PUT, true);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        $headers = array(
            "Authorization: Bearer ".$this->getToken(),
            "Content-Type: application/json",
        );
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

        $obj = [
            "sku"=> $sku,
            "title"=> [
                "de_DE"=> "Claude"
            ],
            "infiniteInventory"=> $infiniteInventory,
            "images"=> $images,
            "category"=> $category,
            "adaptivePrice"=> $adaptivePrice,
            "manualPrice"=> $manualPrice
        ];

        $obj = json_encode($obj);

        $data = <<<DATA
            $obj
        DATA;

        curl_setopt($curl, CURLOPT_POSTFIELDS, $obj);

        //for debug only!
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

        curl_getinfo($curl);
        
        $resp = curl_exec($curl);
        curl_close($curl);
        var_dump($resp);

        return;
    }

【问题讨论】:

  • 使用 curl_error 知道出了什么问题:php.net/manual/en/function.curl-error.php
  • 我现在写了这一行,没有显示任何错误,程序仍然挂起: echo curl_error($curl); $resp = curl_exec($curl);回声 curl_error($curl);
  • “curl_errno”呢?如果没有捕获到错误,则响应没有负载。
  • 它会停止,直到请求完成,这很明显。如果远程端没有及时响应,您的代码可能看起来“挂起”,但这是一种误解。接收代码是什么?请提供minimal reproducible example
  • @Ma'moonAl-Akash 我也试过了,但我的代码挂在 exec 上,我在 exec 之前和之后都没有返回错误。

标签: php rest curl


【解决方案1】:

尝试像这样卷曲:

<?php
$url = "https://system-url.de/myId/products/".$id;
$curl = curl_init();
$obj = [
        "sku"=> $sku,
        "title"=> [
            "de_DE"=> "Claude"
        ],
        "infiniteInventory"=> $infiniteInventory,
        "images"=> $images,
        "category"=> $category,
        "adaptivePrice"=> $adaptivePrice,
        "manualPrice"=> $manualPrice
    ];

    $obj = json_encode($obj);

curl_setopt_array($curl, array(
  CURLOPT_URL => $url,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'PUT',
  CURLOPT_POSTFIELDS => $obj,
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer ".$this->getToken()',
    'Content-Type: application/json'
  ),
));
$response = curl_exec($curl);

curl_close($curl);
echo $response;

注意它和你的不一样 -- : CURLOPT_CUSTOMREQUEST => 'PUT', or curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');

【讨论】:

  • 确实有效,但为什么这里的代码表现如此不同?
  • 有多种方法可以将 curl 转换为 php 我建议使用 Postman 或 Talend Api Test 等... Postman 在上面给了我们这段代码,但是在我复制 curl 和使用:incarnate.github.io/curl-to-php 'PUT',这是正确的行...您使用的行...嗯,我认为这是错误的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2013-10-22
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多