Основываясь на этой статье , я нашел этот метод более удобным для моей usecase.
. Моя ветка «dev» опередила «origin / dev» на 96 коммитов (так что эти коммиты еще не были отодвинуты на пульт).
Я хотел пробить эти коммиты в один, прежде чем нажимать изменение. Я предпочитаю переустановить ветвь в состояние «origin / dev» (это оставит все изменения с 96 фиксированными неустановленными), а затем зафиксирует изменения сразу:
git reset origin/dev
git add --all
git commit -m 'my commit message'
Еще одно существенное отличие, которое еще не упомянуто здесь, заключается в том, что CURLOPT_POSTFIELDS
не может обрабатывать вложенные массивы.
Если мы возьмем вложенный массив ['a' => 1, 'b' => [2, 3, 4]]
, тогда это должно быть параметризовано как a=1&b[]=2&b[]=3&b[]=4
([
и ]
будут / должны быть закодированы в URL).
Это будет работать:
var_dump(http_build_query(['a' => 1, 'b' => [2, 3, 4]]));
// output: string(36) "a=1&b%5B0%5D=2&b%5B1%5D=3&b%5B2%5D=4"
Это не будет отображаться на другом конце (в противном случае это будет PHP). work:
curl_setopt($ch, CURLOPT_POSTFIELDS, ['a' => 1, 'b' => [2, 3, 4]]);
Это даст вам уведомление. Выполнение кода будет продолжаться, и ваша конечная точка получит параметр b
в виде строки "Array"
:
PHP Примечание: массив для преобразования строк в ... on line ...
< / BLOCKQUOTE>
EDIT: от php5 вверх рекомендуется использовать http_build_query
:
string http_build_query ( mixed $query_data [, string $numeric_prefix [,
string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )
Простой пример из руководства:
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data) . "\n";
/* output:
foo=bar&baz=boom&cow=milk&php=hypertext+processor
*/
?>
до php5:
CURLOPT_POSTFIELDS
полные данные для публикации в HTTP-режиме «POST». Чтобы опубликовать файл, добавьте имя файла с помощью @ и используйте полный путь. Тип файла может быть явно указан, следуя имени файла с типом в формате '; type = mimetype'. Этот параметр может быть передан как строка с urlencoded, такая как «para1 = val1 & amp; para2 = val2 & amp; ...» или как массив с именем поля в качестве ключа и данными поля как значение. Если значением является массив, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0, файлы, переданные этому параметру с префиксом @, должны быть в форме массива для работы.
blockquote>Так что что-то вроде этого должно работать отлично (с параметрами, переданными в ассоциативном массив):
function preparePostFields($array) { $params = array(); foreach ($array as $key => $value) { $params[] = $key . '=' . urlencode($value); } return implode('&', $params); }
Если вы отправляете строку, urlencode (). В противном случае, если массив, он должен иметь значение key =>, и заголовок Content-type
автоматически устанавливается на multipart/form-data
.
Кроме того, вам не нужно создавать дополнительные функции для построения запроса для вашего массивов, вы уже имеете это:
$query = http_build_query($data, '', '&');
Этот ответ взял меня навсегда, чтобы найти. Я обнаружил, что все, что вам нужно сделать, это конкатенация URL-адреса («?» После имени файла и расширения) с помощью строки запроса с кодировкой URL. Это даже не похоже на то, что вы должны установить параметры POST cURL. См. Поддельный пример ниже:
//create URL
$exampleURL = 'http://www.example.com/example.php?';
// create curl resource
$ch = curl_init();
// build URL-encoded query string
$data = http_build_query(
array('first' => 'John', 'last' => 'Smith', '&'); // set url
curl_setopt($ch, CURLOPT_URL, $exampleURL . $data);
// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources <br/>
curl_close($ch);
Вы также можете использовать file_get_contents()
:
// read entire webpage file into a string
$output = file_get_contents($exampleURL . $data);
для вложенных массивов, которые вы можете использовать:
$data = [
'name[0]' = 'value 1',
'name[1]' = 'value 2',
'name[2]' = 'value 3',
'id' = 'value 4',
....
];
Для параметра CURLOPT_POSTFIELDS
параметры могут быть переданы как строка с urlencoded, например para1=val1¶2=val2&..
, или как массив с именем поля в качестве ключа и данными поля как значение
Попробуйте следующий формат:
$data = json_encode(array(
"first" => "John",
"last" => "Smith"
));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);
Согласно руководству PHP, данные, переданные cURL в виде строки, должны быть скопированы URL. См. Страницу curl_setopt () и выполните поиск CURLOPT_POSTFIELDS
.
Вы можете передать массив и позволить php / curl выполнять грязную работу кодирования и т. д.