API post 请求在 PostMan 中工作,但在 Laravel 应用程序中不起作用

问题描述 投票:0回答:1

我正在尝试将域别名列表提交到 API 端点,正如标题所示,它在 PostMan 中完美运行..但是当我尝试将其添加到我的 Laravel 应用程序时,我收到“502 Bad Gateway”错误。

相关 API 适用于 Cloudways。文档可以在这里找到:https://developers.cloudways.com/docs/#!/AppManagementApi#updateAppAliases

有问题的具体端点是 https://api.cloudways.com/api/v1/app/manage/aliases

在 PostMan 中,我首先点击 https://api.cloudways.com/api/v1/oauth/access_token 以获得访问令牌。这运行得很好,并且如预期的那样输出了一个不记名令牌。

从那里,我将该数据作为不记名令牌以及请求的参数一起发送。

我将数据作为原始 JSON 发送,它看起来像这样:

{
    "server_id": 111111,
    "app_id": 2222222,
    "aliases": ["testing.somedomain.com", "another.somedomain.com"]
}

当我在 PostMan 中提交此内容时,我会获得 200 状态,并且我可以检查应用程序并看到按预期添加的域别名。

从那里,我获取 PostMan 生成的代码,并将其粘贴到我的控制器中的方法中。

这是代码:

public function updateDomainAliases() {
    $domainList = array();
    foreach($allDomains as $key => $singleDomain) {
        $domain = $singleDomain->subdomain.".".$singleDomain->domain;
        $domainList[] = $domain;
    }

    $accessToken = $this->getAccessToken(env('CLOUDWAYS_EMAIL'), env('CLOUDWAYS_API_KEY'));
    $domainResponse = $this->addDomainAliases($accessToken, env('CLOUDWAYS_SERVER_ID'), env('CLOUDWAYS_APP_ID'), $domainList);
}

private function getAccessToken($email, $apiKey) {
    $response = Http::post('https://api.cloudways.com/api/v1/oauth/access_token', [
        'email' => $email,
        'api_key' => $apiKey,
    ]);

    return $response->json()['access_token'];
}

private function addDomainAliases($accessToken, $serverID, $appID, $aliases) {
    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://api.cloudways.com/api/v1/app/manage/aliases',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS =>'{
            "server_id": 111111,
            "app_id": 2222222,
            "aliases": ["testing.somedomain.com", "another.subdomain.com"]
        }',
        CURLOPT_HTTPHEADER => array(
            'Content-Type: application/json',
            'Authorization: Bearer '.$accessToken
        ),
    ));

    $response = curl_exec($curl);
    curl_close($curl);
    echo $response;
}

所以...正如您所看到的,我的第一步是生成一个访问令牌,一个简单的 dd() 命令验证它是否正常工作。

然后,我将该访问令牌以及服务器 ID、应用程序 ID 和别名发送到我的 addDomainAliases() 函数,然后运行 cURL 命令将数据发送到 API。

这里值得注意的几件事:

  • 我最初将服务器 ID、应用程序 ID 和别名设置为我传入的变量...但是,当这不起作用时,我只是试图让一些硬编码值发挥作用。我怀疑我的单引号和双引号或字符串连接中存在某种错误。因此,我认为仅使用硬编码值就可以解决问题,并且我可以从那里进行调试。不幸的是...这并没有解决问题。

  • 我也尝试过使用硬编码的访问令牌,但无济于事。

  • 我也尝试过其他方法,例如通过Guzzle发送数据,但仍然得到相同的错误。

  • 我确实联系了 Cloudways 支持人员,看看这个特定端点是否存在问题……但他们似乎认为这与代码有关。

所以——我向你们求助。我在这里缺少什么?


编辑:

这是我的邮递员请求:

获取访问令牌: Access Token: Params

Access Token: Headers

发送域名别名数据: Alias: Authorization Alias: Headers Alias: Body

php laravel api curl cloudways
1个回答
0
投票

第一,检查

/storage/logs
中的 laravel 错误日志,并在尝试执行请求时查看其中的内容。

第二,不要使用

env
函数,使用
config
代替,
env
函数只能在配置文件中使用,一旦配置被缓存,该函数将返回 null,任何在配置文件之外的调用都应该使用
config 
功能。您可以在
/config
中为调用
env
函数的 API 密钥添加另一个文件,或者直接将其添加到
/config/app.php
文件中

第三,使用HTTP Client而不是使用curl,这样,您可以轻松调试和验证您的实际请求。

下面是使用 HTTP 客户端的

addDomainAliases
方法的示例。如果您在第二个参数中传递 true,您将看到实际的请求标头、正文和所有请求相关数据

private function addDomainAliases($accessToken, $dump = null ) {

    $url = 'https://api.cloudways.com/api/v1/app/manage/aliases';

    $headers = [
        'Content-Type' => 'application/json',
        'Authorization' => 'Bearer '.$accessToken
    ];
    
    $payload = [
        'server_id' => '111111'
        'app_id' => '2222222'
        'aliases' => ['testing.somedomain.com', 'another.subdomain.com']
    ];

    $request = Http::withOptions([
        'verify' => config('app.env') == 'production',
    ])->withHeaders($headers);

    // dump the actual request and verify the url, headers and payload are all correct
    if ( $dump ) 
        $request->dd()->post($url, $payload );

    $response = $request->post( $url, $payload );

    .
    .
    .
        
}

此外,您的

getAccessToken
请求也返回您期望的数据,如果没有,也转储其请求并验证所有数据是否正确

© www.soinside.com 2019 - 2024. All rights reserved.