Php 在Laravel中用Guzzle发送POST请求

Php 在Laravel中用Guzzle发送POST请求,php,laravel,guzzle,Php,Laravel,Guzzle,我正在尝试使用ZohoMail的API通过我的应用程序发送电子邮件。但它一直给我: “{errorCode”:“无效的_方法”}”,状态:{“代码”:404,说明:““无效的输入”} 以下是我试图拨打的电话的链接: 以下是我的功能: public static function sendEmail ($AccountId, $AuthCode, $FromAddress, $ToAddress, $Subject, $Content){ $client = new Client();

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

“{errorCode”:“无效的_方法”}”,状态:{“代码”:404,说明:““无效的输入”}

以下是我试图拨打的电话的链接:

以下是我的功能:

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!";

}
我试着改变打电话的方式,但这似乎不是问题所在。我在邮递员那里测试过这个电话,效果很好,所以我打电话的方式可能有问题。如有任何帮助,将不胜感激。

请使用:

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

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

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

$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!";

祝你好运

使用cURL进行测试后,我发现URL已“移动”到https而不是http。仅使用http,电话就在邮递员中通过,而不是Guzzle。我所做的唯一更改是创建URL:


该网站仅将其列为http,请求确实通过了邮递员。我以前使用同一API在Guzzle中使用http进行过调用,它们都通过了。如果有人能帮助我理解为什么会发生这种情况,以及为什么在PostMan中而不是Guzzle中使用http时,这个特定调用可以工作,那就太好了。

这在任何地方都可以工作

$client = new \GuzzleHttp\Client();
$response = $client->post(
    'url',
    [
        GuzzleHttp\RequestOptions::JSON => 
        ['key' => 'value']
    ],
    ['Content-Type' => 'application/json']
);

$responseJSON = json_decode($response->getBody(), true);

使用http\Client;
$client=新客户端();
$options=[];
$options['form_params']=$data;
$options['http_errors']=false;//用于获取异常y api响应
$options['timeout']=5;//毫秒
$client->request('PUT',$uri,$options);

我得到的结果是:将“body”请求选项作为数组传递以发送POST请求已被弃用。请使用“form_params”请求选项发送应用程序/x-www-form-urlencoded请求,或使用“multipart”请求选项发送多部分/表单数据请求。是。抱歉,它已被弃用。将body更改为form_params并再次测试。尝试将其更改为json。json主体还有另一种方法。所以它应该是$params['json']=[content];和邮递员一起测试。了解问题的原因。如果它来自API或Guzzle。与postman配合使用效果良好,请尝试仅使用toAddress和FromAddress,因为只需要这两个字段,但调用仍然无法通过。您是否验证了
$body
中的数据是否有效?我的意思是,电子邮件实际上是电子邮件,而不是电子邮件。我在《邮递员》中尝试过这些参数。下面是我要传递的信息:sendEmail(“MyAccountID”、“AuthCode”、“MyEmail”、“MyEmail”、“我喜欢玉米卷”、“我喜欢玉米卷”);我得到的json对象是:{“fromAddress”:“MyAddress”,“toAddress”:“MyAddress”,“subject”:“我喜欢玉米卷”,“content”:“我喜欢玉米卷”}
 $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));