问题描述
我正在使用其MailchimpMarketing \ apiclient()编写器资源向网站添加基本的Mailchimp订阅表单。添加用户似乎可以正常工作,但是当尝试添加已经存在的人时,我希望得到一个不错的json响应,这样我就可以捕获该错误并将其显示给用户,但是我得到了以下GuzzleHttp \ Exception \ ClientException:
Client error: `POST https://us10.api.mailchimp.com/3.0/lists/xxxxxxxxxx/members` resulted in a `400 Bad Request` response:
{"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"Member Exists","status" (truncated...)
该文档似乎并没有真正解释太多,我还必须找到正确的方法来从堆栈溢出中捕获该错误,因为Mailchimps文档也很..缺乏!这是代码:
try {
$response = $mailchimp->lists->addListMember($this->settings_helper->get('mailchimp_list_id'),[
"email_address" => $form->get_field_value('email'),"status" => "subscribed","merge_fields" => [
"FNAME" => $first_name,"LNAME" => $last_name
]
]);
if ($response->getId()) {
$this->add_json_success($this->settings_helper->get('mailchimp_success_message'));
}
} catch (MailchimpMarketing\ApiException $e) {
$errors[] = $e->getMessage();
} catch (ClientErrorResponseException $e) {
$errors[] = $e->getMessage();
} catch (GuzzleHttp\Exception\ClientException $e) {
$errors[] = $e->getMessage();
}
这是我使用的mailchimp文档:https://mailchimp.com/developer/api/marketing/list-members/add-member-to-list/
我只能捕获400的错误代码并输出一个自定义错误,但是我确定我必须做错了什么才能从Mailchimp API获得如此无益的响应?
非常感谢安迪,感谢所有帮助。
解决方法
我遇到了同样的问题,所以我最终通过将最后一个catch子句更改为以下内容来指示错误消息以查看整个错误是什么:
catch (GuzzleHttp\Exception\ClientException $e) {
echo '<pre>' . var_export($e->getResponse()->getBody()->getContents()).'</pre>';
$errors[] = $e->getMessage();
}
这显示了以下糟糕的错误,到目前为止,该错误已被截断:
{
"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"Invalid Resource","status":400,"detail":"Isabell_Murazik@example.com looks fake or invalid,please enter a real email address.","instance":"fcc1d762-2475-40a6-bc7f-4ac7f3fb7902"
}
所以,我的问题是@example.com
看起来是假的或无效的...
尝试使用其他电子邮件,即使@test.com
也可以正常工作。
我不能保证您也会遇到这个问题,但是检查错误详细信息绝对是一个不错的第一步!
我也为此苦苦挣扎。
要显示各种键值,请使用您自己的变体
catch (\GuzzleHttp\Exception\BadResponseException $e) {
$response = $e->getResponse();
$responseBodyAsString = $response->getBody()->getContents();
$decoded = json_decode($responseBodyAsString);
echo $decoded->title;
}