Php 在Laravel中用Guzzle发送POST请求
我正在尝试使用ZohoMail的API通过我的应用程序发送电子邮件。但它一直给我: “{errorCode”:“无效的_方法”}”,状态:{“代码”:404,说明:““无效的输入”} 以下是我试图拨打的电话的链接: 以下是我的功能: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();
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));