使用--form-params和--header将cURL转换为Guzzle POST

时间:2019-02-06 18:42:02

标签: forms curl parameters header guzzle

我正在努力解决给定的卷曲请求,我想解决这个问题。

curl请求看起来像这样:

curl --location --request POST "https://apis.myrest.com" \
  --header "Content-Type: multipart/form-data" \
  --header "Authorization: Bearer YOUR-BEARER-TOKEN" \
  --form "mediaUrl=https://myfile.mpg" \
  --form "configuration={
    \"speechModel\": { \"language\": \"en-US\" },
    \"publish\": {
      \"callbacks\": [{        
      \"url\" : \"https://example.org/callback\"
    }]
  }
}

我希望它通过这样的枪口发送:

// 1. build guzzle client:
//----------------------------------------------------------------------
$this->client = new Client([
    'base_uri' => $this->config->getBaseUri(),
]);

// 2. build guzzle request:
//----------------------------------------------------------------------
$request = new Request(
    'POST',
    'myendpoint',
    [
        'authorization' => 'Bearer ' . $this->config->getApiToken(),
        'cache-control' => 'no-cache',
        'content-type' => 'application/json',

        // maybe here, or not?
        form_params => ['mediaUrl' => 'www.media.com'],
    ]
);

// 3. send via client
//----------------------------------------------------------------------
response = $this->client->send($request, ['timeout' => self::TIMEOUT]);

我现在的问题是,我不知道如何处理此问题。在guzzle的文档中,我找到了“ form_params”: http://docs.guzzlephp.org/en/stable/quickstart.html#making-a-request#post-form-requests

但是它似乎不起作用。如果我将form_params-array添加到我的请求中,则接收方无法获取它们。有人可以告诉我,如何用枪口写出精确的curl命令吗?

谢谢

1 个答案:

答案 0 :(得分:1)

尝试使用multipart代替form_params

http://docs.guzzlephp.org/en/latest/request-options.html#form-params

来自Guzzle文档:

  

form_params不能与multipart选项一起使用。您将需要   使用一个或另一个。使用form_params   application / x-www-form-urlencoded请求,以及用于   多部分/表单数据请求。

另外尝试在启用debug的情况下设置Guzzle Client,因为它将显示发送的原始HTTP请求,因此您可以使用curl命令更轻松地进行比较。

http://docs.guzzlephp.org/en/latest/request-options.html#debug

很难理解您要发送的确切请求是什么,因为curl示例和您的代码之间存在矛盾。我试图尽可能地复制卷发。请注意,Request第三个参数仅包含标头,对于请求选项,您必须使用send的第二个参数。

$client = new Client([
    'base_uri' => 'https://example.org',
    'http_errors' => false
]);

$request = new Request(
    'POST',
    '/test',
    [
        'Authorization' => 'Bearer 19237192837129387',
        'Content-Type' => 'multipart/form-data',
    ]
);

$response = $client->send($request, [
    'timeout' => 10,
    'debug' => true,
    'multipart' => [
        [
            'name'     => 'mediaUrl',
            'contents' => 'https://myfile.mpg'
        ],
        [
            'name'     => 'configuration',
            'contents' => json_encode([
                'speechModel' => [
                    'language' => 'en-US'
                ],
                'publish' => [
                    'callbacks' =>
                        [
                            [
                                'url' => 'https://example.org/callback'
                            ]
                        ]
                ]
            ])
        ]
    ]
]);