AS2*_*012 4 iphone service upload image
我今天已经工作了好几个小时,而且我非常接近解决方案,但显然需要一些人的帮助.我正试图通过iPhone将图像发布到Web服务.我先发布代码,然后解释我尝试过的所有内容:
NSData *imageData = UIImageJPEGRepresentation(barCodePic, .9);
NSString *soapMsg =
[NSString stringWithFormat:
@"<?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><WriteImage xmlns=\"http://myserver/imagewebservice/\"><ImgIn>%@</ImgIn></WriteImage></soap:Body></soap:Envelope>", [NSData dataWithData:imageData]
];
NSURL *url = [NSURL URLWithString:@"http://myserver/imagewebservice/service1.asmx"];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength =
[NSString stringWithFormat:@"%d", [soapMsg length]];
[req addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[req addValue:@"http://myserver/imagewebservice/WriteImage" forHTTPHeaderField:@"SOAPAction"];
[req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[req setHTTPMethod:@"POST"];
[req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
if (conn) {
webData = [[NSMutableData data] retain];
}
Run Code Online (Sandbox Code Playgroud)
首先,这个代码适用于除图像之外的任何东西.Web服务在我的本地网络上运行,我可以随意更改源代码,如果我将"ImgIn"参数更改为字符串并传入一个字符串,一切正常,我得到一个返回值没问题.因此,根本没有连接问题,我能够在此服务器上调用并从此Web服务获取数据没有问题.但我需要通过ImgIn参数将图像上传到此Web服务,因此上面的代码是我迄今为止最好的镜头.我也有didReceiveResponse,didReceiveData,didFailWithError等都被处理.上面的代码每次都会触发didRecieveResponse.但是,didReceiveData永远不会被触发,就像Web服务本身甚至从未运行过一样.当我调试Web服务本身时,当我使用字符串参数时它运行和调试很好,但是使用image参数时,它甚至在我调用它时都不会进行调试.它几乎就像ImgIn参数太长(当我将它输出到屏幕时它很大)并且Web服务只是呛到它.我已经读过在使用这种方法时必须编码到Base64,但我找不到任何关于如何完成的良好链接.如果那就是我做错了,你能不能提供如何做到这一点的代码,而不仅仅是"你需要使用Base64",我真的很感激,因为我几乎找不到任何关于如何用例.除此之外,我有点失落,似乎我正在做其他一切正确的事情.请帮忙!几乎像ImgIn参数太长(当我将它输出到屏幕时它很大)并且Web服务只是呛到它.我已经读过在使用这种方法时必须编码到Base64,但我找不到任何关于如何完成的良好链接.如果那就是我做错了,你能不能提供如何做到这一点的代码,而不仅仅是"你需要使用Base64",我真的很感激,因为我几乎找不到任何关于如何用例.除此之外,我有点失落,似乎我正在做其他一切正确的事情.请帮忙!几乎像ImgIn参数太长(当我将它输出到屏幕时它很大)并且Web服务只是呛到它.我已经读过在使用这种方法时必须编码到Base64,但我找不到任何关于如何完成的良好链接.如果那就是我做错了,你能不能提供如何做到这一点的代码,而不仅仅是"你需要使用Base64",我真的很感激,因为我几乎找不到任何关于如何用例.除此之外,我有点失落,似乎我正在做其他一切正确的事情.请帮忙!你能不能提供如何做的代码,而不仅仅是"你需要使用Base64",我真的很感激,因为我几乎找不到如何用一个例子来实现它.除此之外,我有点失落,似乎我正在做其他一切正确的事情.请帮忙!你能不能提供如何做的代码,而不仅仅是"你需要使用Base64",我真的很感激,因为我几乎找不到如何用一个例子来实现它.除此之外,我有点失落,似乎我正在做其他一切正确的事情.请帮忙!
谢谢
它失败是因为%@格式说明符接受一个对象并调用 - (NSString*)描述将其转换为字符串. - [NSData description]为(ASCII)"123abc"返回类似@"<31 32 33 65 66 67>"的内容,因此您提交的<31 32 33 65 66 67>显然不是有效的XML.不要将字符串粘合在一起(除了其他因素之外,它还容易受到XML注入).
我会丢弃SOAP而只是使用
[req addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
[req setHTTPBody:imgData]
Run Code Online (Sandbox Code Playgroud)
如果你想使用SOAP,那么可能有一个Objective-C SOAP库可以为你打包.如果不这样做,你可以手动指定xs:base64Binary(我认为)并使用base64编码的数据.这些都不是理想的,因为它使数据大33%.如果你运气不好,一个SOAP库会让它变大20000%!