【问题标题】:Sending POST request with Guzzle in Laravel在 Laravel 中使用 Guzzle 发送 POST 请求
【发布时间】:2018-03-21 00:59:08
【问题描述】:

我正在尝试使用 ZohoMail 的 API 通过我的应用程序发送电子邮件。但它一直在给我:

"{errorCode":"INVALID_METHOD"},"status":{"code":404,"description":"无效输入"}}

这是我正在尝试拨打的电话的链接:https://www.zoho.com/mail/help/api/post-send-an-email.html#Request_Body

这是我的功能:

public static function sendEmail ($AccountId, $AuthCode, $FromAddress, $ToAddress, $Subject, $Content){

    $client = new Client(); //GuzzleHttp\Client
    $URI = 'http://mail.zoho.com/api/accounts/' . $AccountId . '/messages';
    $headers = ['Content-Type' => 'application/json', 'Authorization' => 'Zoho-authtoken ' . $AuthCode];
    $body = array('fromAddress' => $FromAddress, 'toAddress' => $ToAddress, 'subject' => $Subject, 'content' => $Content);
    $Nbody = json_encode($body);
    $response = $client->post($URI, $headers, $Nbody);
    echo "DONE!";

}

我尝试过改变拨打电话的方式,但似乎不是问题所在。我已经在 PostMan 中测试了通话,它工作正常,所以我拨打电话的方式可能有问题。任何帮助将不胜感激。

【问题讨论】:

    标签: php laravel guzzle


    【解决方案1】:

    这适用于任何地方

    
    use GuzzleHttp\Client;
    
    $client   = new Client();
    $options = [];
    $options['form_params'] = $data;
    $options['http_errors'] = false; // for get exception y api response
    $options['timeout'] = 5; // milliseconds
    
    $client->request('PUT', $uri , $options);
    

    【讨论】:

      【解决方案2】:
       $this->clients = new Client(['base_uri' => 'Url', 'timeout'  => 2.0]);
          $params['headers'] = ['Content-Type' => 'application/json'];
          $params['json'] = array(
            'parama1'=>$req->parama1,
            'parama1'=>$req->parama2,
            'parama3'=>$req->parama3,
          );
          $response = $this->clients->get('SearchBiz',$params);
          $business = $response->getBody();
          return View("myviewbiz")->with('business',json_decode($business));
      

      【讨论】:

        【解决方案3】:
        $client = new \GuzzleHttp\Client();
        $response = $client->post(
            'url',
            [
                GuzzleHttp\RequestOptions::JSON => 
                ['key' => 'value']
            ],
            ['Content-Type' => 'application/json']
        );
        
        $responseJSON = json_decode($response->getBody(), true);
        

        【讨论】:

          【解决方案4】:

          在使用 cURL 进行测试后,我发现 URL 已被“移动”到 https 而不是 http。仅使用 http,调用在 Postman 中进行,但在 Guzzle 中没有。我所做的唯一更改是制作 URL:

          https://mail.zoho.com/api/accounts/

          该网站仅将其列为 http,并且该请求确实通过 PostMan。我已经在 Guzzle 中从同一个 API 中使用 http 进行了先前的调用,并且他们通过了。如果有人能帮助我理解为什么会发生这种情况,以及为什么在 PostMan 而不是 Guzzle 中使用 http 时这个特定调用有效,那就太好了。

          【讨论】:

            【解决方案5】:

            您需要在同一个数组中创建数据和标题并作为第二个参数传递。像这样使用。

            $client = new Client();
            $URI = 'http://mail.zoho.com/api/accounts/'.$AccountId.'/messages';
            $params['headers'] = ['Content-Type' => 'application/json', 'Authorization' => 'Zoho-authtoken ' . $AuthCode];
            $params['form_params'] = array('fromAddress' => $FromAddress, 'toAddress' => $ToAddress, 'subject' => $Subject, 'content' => $Content);
            $response = $client->post($URI, $params);
            echo "DONE!";
            

            祝你好运!

            【讨论】:

            • 这是我得到的:将“body”请求选项作为数组传递以发送 POST 请求已被弃用。请使用“form_params”请求选项发送 application/x-www-form-urlencoded 请求,或使用“multipart”请求选项发送 multipart/form-data 请求。
            • 是的。抱歉,它已被弃用。将 body 更改为 form_params 并再次测试。
            • 尝试将其更改为 json。 json body 还有另一种方法。所以它会是 $params['json'] = [content];
            • 用 Postman 测试。了解导致问题的原因。如果它来自 API 或 Guzzle。
            • 与邮递员一起工作正常,尝试只使用 toAddress 和 FromAddress 因为只有这两个字段是必需的,但调用仍然没有通过。
            【解决方案6】:

            使用方法:

            $response = $client->post($URI, $headers, ['json' => $body]);
            

            而不是

            $Nbody = json_encode($body);
            $response = $client->post($URI, $headers, $Nbody);
            

            【讨论】:

            • 您是否验证了$body 中的数据有效?我的意思是电子邮件真的是电子邮件,而不是敌人示例数组
            • 我在邮递员中试过这些参数。这是我要传递的内容:sendEmail("MyAccountID", "AuthCode", "MyEmail", "MyEmail", "I like Tacos", "Ilike Tacos");
            • 我得到的 json 对象是:{"fromAddress":"MyAddress","toAddress":"MyAddress","subject":"I like Tacos","content": “我喜欢炸玉米饼”}
            猜你喜欢
            • 2020-07-14
            • 1970-01-01
            • 1970-01-01
            • 2017-12-25
            • 1970-01-01
            • 1970-01-01
            • 2019-01-27
            • 2020-03-28
            • 2018-02-07
            相关资源
            最近更新 更多