я думаю, что вы неправильно кодируете CURLOPT_POSTFIELDS.Вы помните, чтобы кодировать каждый @
как %40
?Вы помните, чтобы кодировать каждый пробел в %20
?Вы помните, чтобы кодировать каждый &
как %26
?я думаю, что ответ - нет.используйте либо urlencode (), либо http_build_query () (в дополнение к тому, чтобы убедиться, что все закодировано правильно, код обычно тоже оказывается намного красивее, если правильно перенести на http_build_query ())
nitpicking:
не устанавливайте заголовок User-Agent
вручную, вместо этого установите CURLOPT_USERAGENT (установка заголовка вручную не будет хорошо работать с CURLOPT_FOLLOWLOCATION, и легко забыть установить его для последующих запросов ... просто как правило)используйте вместо этого CURLOPT_USERAGENT.)
не используйте CURLOPT_CUSTOMREQUEST для запросов POST, установите CURLOPT_POST=>1
- CURLOPT_CUSTOMREQUEST опасен, поскольку он не очищается автоматически (в отличие от CURLOPT_POST) и должен быть вручную установлен в NULL после того, как вы закончитеиспользуя его, и когда программисты забывают очистить CURLOPT_CUSTOMREQUEST, часто возникают ошибки (например, последующие запросы, использующие неправильный тип запроса)
, если специально используются форматы application/x-www-form-urlencoded
или multipart/form-data
, не устанавливайте Content-Type
заголовок вручную, пусть curl устанавливает автоматический заголовокlly, поэтому удалите этот "Content-Type: application/x-www-form-urlencoded; charset=UTF-8"
(во-первых, libcurl имеет автоматические тестовые наборы, работающие, чтобы убедиться, что в заголовке нет опечаток, в отличие от вашей собственной кодовой базы, и для последнего формата вы можете испортить граничный заголовок)
"Accept: */*"
в любом случае является заголовком libcurl по умолчанию, так что вы можете удалить его, если хотите, это не имеет значения (и может привести и здесь аргумент опечаток)