Поддержка Проблемы и решения конвертация curl в wp_remote_post

  • Всем привет, есть такой curl

    $endpoint = $res->url;
    $filename = $imgs['tmp_name'][0];
    $headers = array(
        'Method: POST',
        'Connection: Keep-Alive',
        'User-Agent: DD-SOAP-Client/1.0',
    );
    
    $cfile = curl_file_create($filename);
    $posts = [
        'name' => 'Asset name',
        'file' => $cfile,
    ];
    
    $ch = curl_init($endpoint);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $posts);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    $response = curl_exec($ch);
    curl_close($ch);
    $result = json_decode($response);

    он выполняется после отправки формы, в форме есть поле файла, преобразуется он здесь $cfile = curl_file_create($filename);

    но вроде как есть функция на замену прямого использования curl wp_remote_post, но никак не выходит переписать код с её использованием. Вот попытка:

    // wp_remote_request way
    				$file = @fopen( $imgs['tmp_name'][0], 'r' );
    				$file_size = $imgs['size'][0];
    				$file_data = fread( $imgs['tmp_name'][0], $file_size );
    
    				$headers = array(
    					'Method: POST',
    					'Connection: Keep-Alive',
    					'User-Agent: DD-SOAP-Client/1.0',
    				);
    
    				$posts = [
    					'name' => $project_title,
    					'file' => $file_data,
    				];
    
    				$args = array(
    					'headers' => $headers,
    					'body' => json_encode($posts)
    				);
    
    				$result = wp_remote_post($res->url,$args);

    как прикрепить файл в этом случае, что-то не вхыодит

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Модератор Юрий

    (@yube)

    Если в WP ничего не изменилось, то для передачи файла в POST-запросе boundary и Content-* надо формировать вручную в тельце запроса.

    примерчик бы найти годный

    Модератор Юрий

    (@yube)

    Гугль забанил? 🙂

    multipart (нечто очень похожее я делал для отправки голосового сообщения на мобилу) https://gist.github.com/UmeshSingla/40b5f7b0fb7e0ade0438

    одинокий файл (если я правильно понял) https://gerhardpotgieter.com/2014/07/30/uploading-files-with-wp_remote_post-or-wp_remote_request/

    Спасибо. конечно же гуглил, это уже последняя стадия, прийти на форум за советом)

    что-то с одним из вариантов не вышло

    $file = @fopen( $imgs['tmp_name'][0], 'r' );
    $file_size = $imgs['size'][0];
    $file_data = fread( $file, $file_size );
    
    $args = [
    	'headers'     => [
    		'accept'        => 'application/json', // The API returns JSON
    		'content-type'  => 'application/binary', // Set content type to binary
    	],
    	'body'        => json_encode([
    		'name' => $project_title,
    		'file' => $file_data,
    	])
    ];
    $result = wp_remote_post($res->url, $args);

    получаю ответ от апи
    {«error»:»The name field is required.\nThe file field is required.»}
    т.е. почему-то не видит параметров в боди

    были варианты завернуть значение body в json_encode
    и поставить другой content-type, но

    пробую дальше

    • Ответ изменён 1 год, 5 месяцев назад пользователем alfaq.
    Модератор Юрий

    (@yube)

    прийти на форум за советом

    Этот форум скорее для админов, чем для разработчиков.

    почему-то не видит параметров в боди

    Возможно, приемник ожидает мультипарт, а не одинокий json-файл.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «конвертация curl в wp_remote_post» закрыта для новых ответов.