PHP将multipart和xml一起提交到Web服务 [英] php submitting multipart and xml together to web service

查看:70
本文介绍了PHP将multipart和xml一起提交到Web服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将XML和图像一起提交到一个宁静的Web服务.使用curl是否可能?

在网络上可用的各种示例中,我可以看到它们正在一起传递多部分数据和其他表单数据.但是,我找不到一个同时发送XML和图像的示例.

这是我正在尝试的代码.

Web服务是用Java完成的. Tomcat日志给出此错误.

org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: WebApplicationException has been caught : Couldn't find MIME boundary: -----------------------8a09e81751

解决方案

我可以在朋友Gerald Cantor的帮助下解决此问题.我在下面发布答案.

这是因为请求格式错误.边界定义不正确.更改的部分如下所示.

<?php
$url = "http://www.myservice.com/event";

$file = dirname(__FILE__) . "\image.jpg"; 
$boundary  = "---------------------".substr(md5(rand(0,32000)), 0, 10);  

$event_xml_data =
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' .
'<ns5:event ' .
'xmlns="http://www.myservice.com/Common/"' .
'xmlns:ns2="http://www.myservice.com/Event/"' .
'xmlns:ns3="http://www.myservice.com/Media/"' .
'xmlns:ns4="http://www.myservice.com/Media/" ' .
'xmlns:ns5="http://www.myservice.com/Event/"> ' .
'<id>0</id>' .
'<name>Event2004</name> '.
'<ns2:description>Description845</ns2:description>' .
'<ns2:startDate>2012-02-27T22:21:29.458-06:00</ns2:startDate>' .
'<ns2:owner>Madhu</ns2:owner>' .
'</ns5:event>';

$content_type_header = 'Content-Type: multipart/form-data; '
    .'type="application/xml"; '
    .'boundary="' . $boundary . '"; '
    .'start="<event>"; '
    .'start-info="application/xml";';
$accept_header = 'Accept: multipart/form-data';
$transfer_encoding_header = 'Transfer-Encoding: chunked';

$fileContents = file_get_contents($file);

$headers = array($content_type_header, $accept_header, $transfer_encoding_header);

// Here is the change.
$postData  = "--" . $boundary . "\r\n"
            ."Content-Type: application/xml\r\n"
            ."Content-Transfer-Encoding: binary\r\n"
            ."Content-ID: <event>\r\n\r\n"
            .$event_xml_data . "\r\n"
            ."--" .$boundary . "\r\n"
            ."Content-Type: image/jpeg\r\n"
            ."Content-Transfer-Encoding: binary\r\n"
            ."Content-ID: <media>\r\n\r\n"
            . $fileContents . "\r\n"
            ."--" .$boundary . "--";

$postDataNoMedia  = "--" . $boundary . "\r\n"
            ."Content-Type: application/xml\r\n"
            ."Content-Transfer-Encoding: binary\r\n"
            ."Content-ID: <event>\r\n\r\n"
            .$event_xml_data . "\r\n"
            ."--" .$boundary . "--";
// Change ends.

$f = fopen('request.txt', 'w');
//open connection
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, 'madhukampurath:xxxxxx');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postDataNoMedia);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
curl_setopt($ch, CURLOPT_VERBOSE  ,1);
curl_setopt($ch, CURLOPT_STDERR  , $f);

//execute post
$output = curl_exec($ch);


$error = curl_error($ch);
$http_code = curl_getinfo($ch ,CURLINFO_HTTP_CODE); 

fclose($f);

echo $http_code . "<br />";

echo $output; 

echo $error; 

curl_close($ch); 

?>

I need to submit an XML and an image together to a restful web service. Is this possible using curl ?

Of the various examples available in web, I could see that they are passing a multipart and other form data together. But, I could not locate an example which sends an XML and an image together.

Here is the code I am trying.

<?php
$url = "http://www.myservice.com/event";

$file = dirname(__FILE__) . "\image.jpg"; 
$boundary  = "---------------------".substr(md5(rand(0,32000)), 0, 10);  

$event_xml_data =
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' .
'<ns5:event ' .
'xmlns="http://www.myservice.com/Common/"' .
'xmlns:ns2="http://www.myservice.com/Event/"' .
'xmlns:ns3="http://www.myservice.com/Media/"' .
'xmlns:ns4="http://www.myservice.com/Media/" ' .
'xmlns:ns5="http://www.myservice.com/Event/"> ' .
'<id>0</id>' .
'<name>Event2004</name> '.
'<ns2:description>Description845</ns2:description>' .
'<ns2:startDate>2012-02-27T22:21:29.458-06:00</ns2:startDate>' .
'<ns2:owner>Madhu</ns2:owner>' .
'</ns5:event>';

$content_type_header = 'Content-Type: multipart/form-data; '
    .'type="application/xml"; '
    .'boundary="' . $boundary . '"; '
    .'start="<event>"; '
    .'start-info="application/xml";';
$accept_header = 'Accept: multipart/form-data';
$transfer_encoding_header = 'Transfer-Encoding: chunked';

$fileContents = file_get_contents($file);

$headers = array($content_type_header, $accept_header, $transfer_encoding_header);

$postData  = $boundary . "\r\n"
        ."Content-Type: application/xml\r\n\r\n"
     ."Content-Transfer-Encoding: binary\r\n\r\n"
        ."Content-ID: <event>\r\n\r\n"
        .$event_xml_data . "\r\n"
        .$boundary . "\r\n"
        ."Content-Type: image/jpeg\r\n"
        ."Content-Transfer-Encoding: binary\r\n\r\n"
        . $fileContents . "\r\n"
        .$boundary . "--\r\n";

$postDataNoMedia  = $boundary . "\r\n"
        ."Content-Type: application/xml\r\n\r\n"
     ."Content-Transfer-Encoding: binary\r\n\r\n"
        ."Content-ID: <event>\r\n\r\n"
        .$event_xml_data . "\r\n"
        .$boundary . "--\r\n";

$f = fopen('request.txt', 'w');
//open connection
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, 'madhukampurath:xxxxxx');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postDataNoMedia);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
curl_setopt($ch, CURLOPT_VERBOSE  ,1);
curl_setopt($ch, CURLOPT_STDERR  , $f);

//execute post
$output = curl_exec($ch);


$error = curl_error($ch);
$http_code = curl_getinfo($ch ,CURLINFO_HTTP_CODE); 

fclose($f);

echo $http_code . "<br />";

echo $output; 

echo $error; 

curl_close($ch); 

?>

Web service is done in java. Tomcat logs give this error.

org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: WebApplicationException has been caught : Couldn't find MIME boundary: -----------------------8a09e81751

解决方案

I could solve the issue with the help of my friend Gerald Cantor. I am posting the answer below.

It was because of a badly formed request. The boundaries were not defined correctly. Changed section is indicated below.

<?php
$url = "http://www.myservice.com/event";

$file = dirname(__FILE__) . "\image.jpg"; 
$boundary  = "---------------------".substr(md5(rand(0,32000)), 0, 10);  

$event_xml_data =
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' .
'<ns5:event ' .
'xmlns="http://www.myservice.com/Common/"' .
'xmlns:ns2="http://www.myservice.com/Event/"' .
'xmlns:ns3="http://www.myservice.com/Media/"' .
'xmlns:ns4="http://www.myservice.com/Media/" ' .
'xmlns:ns5="http://www.myservice.com/Event/"> ' .
'<id>0</id>' .
'<name>Event2004</name> '.
'<ns2:description>Description845</ns2:description>' .
'<ns2:startDate>2012-02-27T22:21:29.458-06:00</ns2:startDate>' .
'<ns2:owner>Madhu</ns2:owner>' .
'</ns5:event>';

$content_type_header = 'Content-Type: multipart/form-data; '
    .'type="application/xml"; '
    .'boundary="' . $boundary . '"; '
    .'start="<event>"; '
    .'start-info="application/xml";';
$accept_header = 'Accept: multipart/form-data';
$transfer_encoding_header = 'Transfer-Encoding: chunked';

$fileContents = file_get_contents($file);

$headers = array($content_type_header, $accept_header, $transfer_encoding_header);

// Here is the change.
$postData  = "--" . $boundary . "\r\n"
            ."Content-Type: application/xml\r\n"
            ."Content-Transfer-Encoding: binary\r\n"
            ."Content-ID: <event>\r\n\r\n"
            .$event_xml_data . "\r\n"
            ."--" .$boundary . "\r\n"
            ."Content-Type: image/jpeg\r\n"
            ."Content-Transfer-Encoding: binary\r\n"
            ."Content-ID: <media>\r\n\r\n"
            . $fileContents . "\r\n"
            ."--" .$boundary . "--";

$postDataNoMedia  = "--" . $boundary . "\r\n"
            ."Content-Type: application/xml\r\n"
            ."Content-Transfer-Encoding: binary\r\n"
            ."Content-ID: <event>\r\n\r\n"
            .$event_xml_data . "\r\n"
            ."--" .$boundary . "--";
// Change ends.

$f = fopen('request.txt', 'w');
//open connection
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, 'madhukampurath:xxxxxx');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postDataNoMedia);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
curl_setopt($ch, CURLOPT_VERBOSE  ,1);
curl_setopt($ch, CURLOPT_STDERR  , $f);

//execute post
$output = curl_exec($ch);


$error = curl_error($ch);
$http_code = curl_getinfo($ch ,CURLINFO_HTTP_CODE); 

fclose($f);

echo $http_code . "<br />";

echo $output; 

echo $error; 

curl_close($ch); 

?>

这篇关于PHP将multipart和xml一起提交到Web服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆