繁体   English   中英

如何使用PHP cURL发送XML文件?

[英]How to send an XML-file with PHP cURL?

这个问题的答案是市场:

如何使用cURL在php上发布XML文件?

但是在我看来,这个答案并不是真正的正确答案,因为它只是说明了如何使用cURL发送XML代码。 我需要发送一个XML 文件

基本上,我需要将此C#代码转换为PHP:

public Guid? UploadXmlFile()
{
    var fileUploadClient = new WebClient();
    fileUploadClient.Headers.Add("Content-Type", "application/xml");
    fileUploadClient.Headers.Add("Authorization", "api " + ApiKey);

    var rawResponse = fileUploadClient.UploadFile(Url, FilePath);
    var stringResponse = Encoding.ASCII.GetString(rawResponse);

    var jsonResponse = JObject.Parse(stringResponse);
    if (jsonResponse != null)
    {
        var importFileId = jsonResponse.GetValue("ImportId");
        if (importFileId != null)
        {
            return new Guid(importFileId.ToString());
        }
    }
    return null;
}

我已经尝试了几种方法,这是我的最新尝试。

cURL调用:

/**
 * CDON API Call
 *
 */
function cdon_api($way, $method, $postfields=false, $contenttype=false)
{
    global $api_key;

    $contenttype = (!$contenttype) ? 'application/x-www-form-urlencoded' : $contenttype;

    $curlOpts = array(
        CURLOPT_URL => 'https://admin.marketplace.cdon.com/api/'.$method,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 60,
        CURLOPT_HTTPHEADER => array('Authorization: api '.$api_key, 'Content-type: '.$contenttype, 'Accept: application/xml')
    );

        if ($way == 'post')
        {
            $curlOpts[CURLOPT_POST] = TRUE;
        }
        elseif ($way == 'put')
        {
            $curlOpts[CURLOPT_PUT] = TRUE;
        }

        if ($postfields !== false)
        {
            $curlOpts[CURLOPT_POSTFIELDS] = $postfields;
        }

    # make the call
    $ch = curl_init();
    curl_setopt_array($ch, $curlOpts);
    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
}

文件导出:

/**
 * Export products
 *
 */
function cdon_export()
{
    global $api_key;

    $upload_dir = wp_upload_dir();
    $filepath = $upload_dir['basedir'] . '/cdon-feed.xml';

    $response = cdon_api('post', 'importfile', array('uploaded_file' => '@/'.realpath($filepath).';type=text/xml'), 'multipart/form-data');

    echo '<br>Response 1: <pre>'.print_r(json_decode($response), true).'</pre><br>';

    $data = json_decode($response, true);

        if (!empty($data['ImportId']))
        {
            $response = cdon_api('put', 'importfile?importFileId='.$data['ImportId'], false, 'text/xml');

            echo 'Response 2: <pre>'.print_r(json_decode($response), true).'</pre><br>';

            $data = json_decode($response, true);
        }
}

但是我得到的输出是这样的:


回应1:

stdClass对象([消息] =>请求不包含有效的媒体类型。)


我在不同的地方尝试了不同的类型, application/xmlmultipart/form-datatext/xml ,但是没有任何效果。

我该怎么做才能使其正常工作? 如何管理使用cURL发送XML文件?

在我看来,C#代码的作用等同于

function UploadXmlFile(): ?string {
    $ch = curl_init ( $url );
    curl_setopt_array ( $ch, array (
            CURLOPT_POST => 1,
            CURLOPT_HTTPHEADER => array (
                    "Content-Type: application/xml",
                    "Authorization: api " . $ApiKey 
            ),
            CURLOPT_POSTFIELDS => file_get_contents ( $filepath ),
            CURLOPT_RETURNTRANSFER => true 
    ) );
    $jsonResponse = json_decode ( ($response = curl_exec ( $ch )) );
    curl_close ( $ch );
    return $jsonResponse->importId ?? NULL;
}

但至少有1个区别,您的PHP代码添加了标头'Accept: application/xml' ,而您的C#代码没有

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM