I am trying to send a PUT request using CURL, but i am getting HTTP 400 Bad Request, I am using CURLOPT_VERBOSE
to debug and with that i am getting: "Error: malformed request: Expecting object found: \"email\""} Does anybody know what this means/how i can fix?
Code:
// Set the HTTP headers needed for this API call.
$http_headers = array(
// "Authorization: Basic xxxxxxxxxxxxxxxxxx",
"Accept: application/json",
"Connection: close", // Disable Keep-Alive
"Expect:", // Disable "100 Continue" server response
"Content-Type: application/json" // Content Type json
);
// URL Endpoint of the API to be called.
$ym_api_url = 'https://services.yesmail.com/enterprise/subscribers/718880';
$newsubscriber = array(
'email' => '[email protected]',
'firstName' => 'Karina',
'lastName' => 'McG',
'postCode' => 'BT93 EP3',
'prefersMobile' => '',
'emailFormat' => 'HTML'
);
$curl_hdl = curl_init();
$curl_options = array(
CURLOPT_VERBOSE => TRUE, // Verbose mode for diagnostics
CURLOPT_STDERR => $verbose = fopen('php://temp', 'rw+'), // Verbose output to STDERR
CURLOPT_HEADER => TRUE, // Include the header in the output.
CURLOPT_HTTPHEADER => $http_headers, // HTTP headers to set
CURLOPT_HTTPAUTH => CURLAUTH_BASIC, // Use basic authentication.
CURLOPT_USERPWD => 'xxxxxxx:xxxxxxxx', //Username/Password
CURLOPT_PROTOCOLS => CURLPROTO_HTTPS, // Bitmask of protocols libcurl may use in this transfer
CURLOPT_RETURNTRANSFER => TRUE, // Return result as return value of curl_exec()
CURLOPT_URL => $ym_api_url, // URL to POST data to
);
curl_setopt_array($curl_hdl, $curl_options);
//Send array to URL
curl_setopt($curl_hdl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($curl_hdl, CURLOPT_POSTFIELDS, http_build_query($newsubscriber));
//SSL Bypass (!Temporary!)
curl_setopt($curl_hdl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl_hdl, CURLOPT_SSL_VERIFYPEER, 0);
// Make the API call
$response = curl_exec($curl_hdl);
// Get the http response code
$http_response_code = curl_getinfo($curl_hdl, CURLINFO_HTTP_CODE);
// Echo out the Verbose Information
echo "Verbose information:\n<pre>", !rewind($verbose), htmlspecialchars(stream_get_contents($verbose)), "</pre>\n";
curl_close($curl_hdl);
echo PHP_EOL . "INFO: HTTP Response Code was: " . $http_response_code . PHP_EOL;
if ( $response === false )
{
echo PHP_EOL . "ERROR: curl_exec() has failed." . PHP_EOL;
}
else
{
echo PHP_EOL . "INFO: Response Follows..." . PHP_EOL;
echo PHP_EOL . $response;
}
The bad request is coming from the service that you are trying to reach not from curl. So you need to be sure that you send them the data in correct format.