Конвертировать команду curl в PHP cURL — kaaProject

    curl -v -S -u devuser:devuser123 \
-F 'notification={"applicationId":"32768","schemaId":"32771","topicId":"32768","type":"USER"};type=application/json' \
-F file=@notification.json \
'http://localhost:8080/kaaAdmin/rest/api/sendNotification'

Я попытался преобразовать его в PHP и закончился так:

    $notification = array("applicationId" =>"32768",
"schemaId"=>"32771",
"topicId"=>"32768",
"type"=>"USER");
$ch = curl_init();
$headers = array();
$headers[] = 'Authorization: Basic ZGV2dXNlcjpkZXZ1c2VyMTIz';
$headers[] = 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryzeZR8KqAYJyI2jPL';
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8080/kaaAdmin/rest/api/sendNotification');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, '3');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'notification='.json_encode($notification).'&file='.realpath('notification.json'));
$content = curl_exec($ch);
print $content;
curl_close($ch);

Я не знаю, как установить параметр «уведомления» и «файл».
пожалуйста, дайте мне решение.

Спасибо!

2

Решение

Я бы предложил вам попробовать следующий код:

    $notification = array("applicationId" =>"32768",
"schemaId"=>"32771",
"topicId"=>"32768",
"type"=>"USER");

$ch = curl_init();

$headers = array();
$headers[] = 'Content-Type: multipart/form-data';

curl_setopt($ch, CURLOPT_USERPWD, "devuser:devuser123");
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8080/kaaAdmin/rest/api/sendNotification');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, '3');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'notification' => json_encode($notification),
'file' => '@' . 'notification.json'
));
$content = curl_exec($ch);
print $content;
curl_close($ch);

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

Вместо

--------------------------5766b31cc6648aa7
Content-Disposition: form-data; name="notification"Content-Type: application/json

{"applicationId":"32768","schemaId":"32771","topicId":"32768","type":"USER"}
--------------------------5766b31cc6648aa7

это отправляет

--------------------------dd3a987c4561b96a
Content-Disposition: form-data; name="notification"
{"applicationId":"32768","schemaId":"32771","topicId":"32768","type":"USER"}
--------------------------dd3a987c4561b96a

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

================ ОБНОВЛЕНИЕ 1 ====================

Вот ужасный сценарий, который должен работать

function multipart_build_query($fields, $boundary){
$retval = '';
foreach($fields as $name => $v){
$data = $v[0];
$filename = (isset($v[1])) ? '; filename="' . $v[1] . '"' : '';
$type = (isset($v[2])) ? 'Content-Type: ' . $v[2] . "\n" : '';

$retval .=  "--$boundary\n" .
"Content-Disposition: form-data; name=\"$name\"$filename\n$type\n" .
"$data\n";
}
$retval .= "--$boundary--\n";
return $retval;
}$notification = array("applicationId" =>"32768",
"schemaId"=>"32771",
"topicId"=>"32768",
"type"=>"USER");

$post_data = array(
'notification' =>       array(
json_encode($notification),
null,
'application/json'
),
'file' =>               array(
file_get_contents('notification.json'),
'notification.json',
'application/octet-stream'
)
);

$boundary = md5(time() . mt_rand(1, 65536));$ch = curl_init();
$headers = array();
$headers[] = 'Content-Type: multipart/form-data; boundary=' . $boundary;
curl_setopt($ch, CURLOPT_USERPWD, "devuser:devuser123");
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8080/kaaAdmin/rest/api/sendNotification');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, '3');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, multipart_build_query($post_data, $boundary));
$content = curl_exec($ch);
print $content;
curl_close($ch);

—— ОБНОВЛЕНИЕ 2: необработанный запрос добавлен ——

POST /kaaAdmin/rest/api/sendNotification HTTP/1.1
Host: localhost:8088
Authorization: Basic ZGV2dXNlcjpkZXZ1c2VyMTIz
User-Agent: curl/7.43.0
Accept: */*
Content-Length: 430
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------f03cb5aef819a622

--------------------------f03cb5aef819a622
Content-Disposition: form-data; name="notification"Content-Type: application/json

{"applicationId":"32768","schemaId":"32771","topicId":"32768","type":"USER"}
--------------------------f03cb5aef819a622
Content-Disposition: form-data; name="file"; filename="notification.json"Content-Type: application/octet-stream

asdasdasdad

--------------------------f03cb5aef819a622--
1

Другие решения

Можете ли вы поместить необработанные данные заголовков и тела запроса, который вы получили с этим php-кодом?
Я пытаюсь сделать то же самое в Csharp.
Спасибо

0