【问题标题】:Convert curl command to PHP cURL - kaaProject将 curl 命令转换为 PHP cURL - kaaProject
【发布时间】:2017-01-01 03:00:27
【问题描述】:
    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);

我不知道如何设置参数“通知”和“文件”。 请给我一个解决方案。

谢谢!

【问题讨论】:

  • 当您在试图让代码工作而不是为您编写代码时遇到困难时,我们会在这里为您提供帮助。你需要先表现出一些努力。
  • 我的帖子已编辑,请帮助我@aynber

标签: php command php-curl curl-commandline kaa


【解决方案1】:

我建议你试试下面的代码:

    $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 命令相同,但有一个区别 - 它不为 notification 参数提供 Content-Type

代替

--------------------------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--

【讨论】:

  • 感谢您的回答,我尝试运行您的代码,但没有成功。我仍然收到错误“所需的请求部分'通知'不存在”。请帮我处理不同的脚本,再次感谢。
  • 这很可悲。我已经用新脚本(在底部)更新了我的初始答案。请检查一下。
  • 嗨@sota,你让我开心:-D 在你的函数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] . "\r\n" : ''; $retval .= "--$boundary\r\n" . "Content-Disposition: form-data; name=\"$name\"$filename\r\n$type\r\n"."$data\r\n"; } $retval .= "--$boundary--\r\n"; return $retval; }中添加“\r”后你的脚本会正常工作@
【解决方案2】:

你能把你得到的请求的标题和正文的原始数据放在这个 php 代码中吗? 我正在尝试在 Csharp 中做同样的事情。 谢谢

【讨论】:

  • 嗨!在我上面的初始答案中发布了原始请求。
猜你喜欢
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多