как использовать --data-binary в команде bash curl с несколькими параметрами - PullRequest
0 голосов
/ 01 июня 2018
<?php
$post_data = array(
    'filename'=>new \CurlFile($uploadPath),
    'jsondata'=> json_encode($params,JSON_UNESCAPED_UNICODE)
$toPdfApi='https://example.com/convert2PDF'
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$toPdfApi);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_BINARYTRANSFER,true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'multipart/form-data',
        'application/x-www-form-urlencoded'));
curl_setopt($curl, CURLOPT_POSTFIELDS,$post_data);
$result = curl_exec($curl);

Затем я конвертирую его в команду оболочки bash

curl -i -X POST -H "Content-Type: multipart/form-data" -H "Content-Type: application/x-www-form-urlencoded" --data-binary  'filename=@/root/test.txt' --data-binary   'jsondata={"fileName":"test","id":"xxx","backlink":"https://example.com/hello"}' https://example.com/convert2PDF

Но результат ответа все еще не верен

HTTP/1.1 200 OK
Date: Fri, 01 Jun 2018 14:41:37 GMT
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Server: Jetty(9.4.5.v20170502)

error

Может кто-нибудь помочь?это моя скрытая оболочка bash, верно?

если я использую следующую команду [заменить -data-binary на -F], я получаю правильный статус, но из кода php, который я знаю, я должен добавить CURLOPT_BINARYTRANSFER вbash curl, в противном случае https://example.com/convert2PDF не может получить правильные данные для публикации.

curl -i -X POST -H "Content-Type: multipart/form-data" -H "Content-Type: application/x-www-form-urlencoded" -F  'filename=@/root/test.txt' -F   'jsondata={"fileName":"test","id":"xxx","backlink":"https://example.com/hello"}' https://example.com/convert2PDF

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Fri, 01 Jun 2018 16:29:35 GMT
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Server: Jetty(9.4.5.v20170502)

success

Я хочу получить ответный статус 200, и результат будет успешным в режиме --data-binaryЧто я могу сделать, чтобы обновить мою команду Bash?

1 Ответ

0 голосов
/ 01 июня 2018

Весь смысл --data-binary в том, что это один большой кусок байтов.Вы можете отправить только один, так как каждый HTTP-запрос имеет только одно тело и может иметь только один тип содержимого верхнего уровня.

Похоже, вы пытаетесь создать тело запроса из нескольких частей, которое состоит из двух частей.части, одна из которых содержит данные файла, а другая содержит пары ключ / значение.

Чтобы отправить файл с некоторыми метаданными через командную строку, вы можете сделать это:

curl -F'id=xxx' -F 'name=foo' -F'file=@test.txt;type=text/plain' http://example.com

Это отправит мульти-частный запрос, при котором бэкэнд PHP мог получить доступ к метаданным из $ _POST и данным файла из $ _FILES.

Точный требуемый подход будет зависеть от того, что серверная часть ожидает получить, но вы не опубликовали это.

Например, следующее будет работать с --data-binary (согласно вашему вопросу), но параметры и данные файла будут доступны по-разному на стороне сервера.

curl --data-binary '@test.txt' 'http://example.com?id=xxx&name=foo'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...