У нас есть несколько приложений, используя Car2go Rest-API с OAuth 1.0.
Все наши веб-приложения перестали работать 2 дня назад. Все curl
POST
запросы не работают со следующей ошибкой:
400 Bad Request Your browser sent a request that this server could not understand. Error code: 53 Parser Error: [Content-Length: -]
Я трачу много времени, пытаясь выяснить, является ли проблема моим рабочим процессом. Но в конце все параметры, подписи и прочее правильны. Я успешно POST
через Postman (REST-Client)
Поэтому я пришел к выводу, что как-то PHP-код для завитка внезапно перестает работать.
Это (очень уродливая) функция завитка. Разница с большинством руководств по curl POST заключается в том, что я CURLOPT_POSTFIELDS
полный URL-адрес со всеми уже прикрепленными параметрами, поэтому мне не нужны CURLOPT_POSTFIELDS
.
function curlAPI($params) { //open connection $ch = curl_init(); $url = $params['url']; curl_setopt($ch,CURLOPT_HEADER,false); //set the url, number of POST vars, POST data curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true); curl_setopt($ch, CURLOPT_MAXREDIRS,50); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000); if($params['type'] == 'POST') { // POST curl_setopt($ch,CURLOPT_POST, true); } else if($params['type'] == 'DELETE') { // DELETE curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); } else if($params['type'] == 'PUT') { $update_json = array(); // PUT curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS,''); } else { // GET curl_setopt($ch,CURLOPT_POST,0); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //execute post $result['result'] = curl_exec($ch); // debug if (FALSE === $result['result']) { $result['errorInfo'] = curl_error($ch).' - '.curl_errno($ch); } $reponseInfo = array(); $reponseInfo['info'] = curl_getinfo($ch); $reponseInfo['error'] = curl_error($ch); //close connection curl_close($ch); $result['reponseInfo'] = $reponseInfo; return json_encode($result); }
Хорошо, это то, что фиксировало этот кошмар:
curl_setopt($ch,CURLOPT_HTTPHEADER ,array('Content-Length: 0'));
По-видимому, нехорошо отправлять curl POST
без заголовка.