3

我看过很多例子和论坛,但对我来说还不清楚。我想用手机拍照然后发送到WebService。
在 WebService 中,我有一个UploadImage将图像保存在网站中的功能。这个函数的参数是:

 <UploadImage xmlns="http://*********">
  <urlSite>http://********</urlSite>
  <iListName>{*************}</iListName>
  <iUpdateMode>*******</iUpdateMode>
  <iMetaData><Fields><Field Name=”Title” >Title of the Image</Field></Fields></iMetaData>
  <iAttachments><Attachments><Attachment Name=”Name of the file”&gt;file in the format Base64String</Attachment></Attachments></iAttachments>
  <iOverWrite>****</iOverWrite>
</UploadImage>  

发帖请求:

function sendImage ()
{
    var wsUrl = "*******?op=UploadImage";
    var soapRequest ='<?xml version="1.0" encoding="utf-8"?> \
        <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" \
         xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> \
  <soap:Body> \
    <UploadImage xmlns="**********"> \
      <urlSite>**********</urlSite> \
      <iListName>{******}</iListName> \
      <iUpdateMode>********</iUpdateMode> \
      <iMetaData><Fields><Field Name=”Title” >Title of the Image</Field></Fields></iMetaData>
      <iAttachments><Attachments><Attachment Name=”Name of the file”&gt;file in the format Base64String</Attachment></Attachments></iAttachments> \
      <iOverWrite>*****</iOverWrite> \
    </UploadImage> \
  </soap:Body> \
</soap:Envelope>';
    var xmlhttp =  createXMLHttpRequest();


xmlhttp.open("POST", wsUrl, true,"username","password");

xmlhttp.setRequestHeader ("Post", "********");
xmlhttp.setRequestHeader ("Host", "*****");
xmlhttp.setRequestHeader ("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("Content-Length", soapRequest.length);
xmlhttp.setRequestHeader ("SOAPAction", "******");


xmlhttp.onerror = function(e) {
    alert("Error ocurred. Error = " + e.message);
}

xmlhttp.ontimeout = function(e) {
    alert("Timeout error!");
}

xmlhttp.onreadystatechange  = function () { 
    alert(xmlhttp.readyState);

    if (xmlhttp.readyState==4)
    {
        alert(xmlhttp.responseText);
        alert(xmlhttp.status);
        // if "OK"
        if (xmlhttp.status==200 || xmlhttp.status==0)
        {
            alert(xmlhttp.responseXML);
        //[Get xmlhttp.responseXML.xml and do something with it]

        }
        else
        {
        //[Get xmlhttp.responseXML.xml and do something with it in the case of an error]
        }
    }
}


xmlhttp.send(soapRequest);

}

状态 t=returned 为 0。
在标签<iAttachments><Attachments><Attachment Name=”Name of the file”&gt;file in the format Base64String</Attachment></Attachments></iAttachments>中我应该发送一个 Base64 格式的文件,但是我不知道如何将这种格式的文件放在这个标签中,所以我发送了一个字符串,也许这是一个原因问题!

我试图用 jquery.ajax 发布它:

function sendReq()
{    var wsUrl = "*******";
    var soapRequest ='<?xml version="1.0" encoding="utf-8"?>'+
        '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
  '<soap:Body>'+
    '<UpdateImage xmlns="*******">'+
      '<urlSite>*********</urlSite>'+
      '<iListName>{*****}</iListName>'+
      '<iUpdateMode>****</iUpdateMode>'+
      '<iMetaData><Fields><Field Name="Title" >'+my_var1+'</Field></Fields></iMetaData>'+
      '<iAttachments><Attachments><Attachment Name="Nom du fichier 1">'+my_var2+'</Attachment></Attachments></iAttachments>'+
      '<iOverWrite>*****</iOverWrite>'+
    '</UpdateImage>'+
  '</soap:Body>'+
'</soap:Envelope>';
   $.ajax({
                    type: "POST",
                    url: wsUrl,
                    contentType: "text/xml; charset=utf-8",
                    dataType: "xml",
                    data: soapRequest,
                    beforeSend: function (xhr){ 
        xhr.setRequestHeader('Authorization', make_base_auth('username', 'password')); 
        xhr.setRequestHeader("SOAPAction", "****/UpdateImage");
    },                
    contentType: "text/xml; charset=utf-8",

                success: processSuccess,
                error: processError
            });
return false;

}

结果是:req.responseText=undefinedstatus=error

4

1 回答 1

0

我会用一些在线工具(例如http://www.opinionatedgeek.com/dotnet/tools/base64encode/)对文件进行base64编码,并将字符串硬编码到您的xml中。看看这是否有效,以检查您的其余代码是否正常。

如果可行,请查看此问题,了解如何在发送文件之前对其进行 base64 编码: Get Base64 encode file-data from Input Form

此外 - 调试代理在这种情况下非常有用,因此您可以看到正在发送的实际请求。如果您有一些已经可以使用此服务的东西,您可以使用 fiddler ( http://fiddler2.com/ ) 之类的东西来获取请求并将其与您的请求进行比较。

于 2013-10-03T15:39:47.547 回答