【问题标题】:Http request from C# to Objective C从 C# 到 Objective C 的 Http 请求
【发布时间】:2013-12-03 10:03:56
【问题描述】:

首先我很抱歉这种问题,我对Objective C有点困惑, 我正在尝试编写的功能是使用 Web 服务将图像上传到服务器,我已经使用 C# 对其进行了用餐,但我无法弄清楚我的 Objective-C 代码中的问题是什么

C#代码是:

using(var wb=new WebClient){
var Data=new NameValueCollection();
data["image"]=base64(fileName)/*base64 is a function to convert the image with"file name" to base64 string*/
Uri myUri=new Uri("http://localHost:8080/test2/sss/users/1/uploadImage");
var respose=wb.UploadValues(myUri,"Post",Data)
}

我正在尝试使用的 Objective-C 代码:

NSData* data = UIImageJPEGRepresentation(theImageView.image, 1.0f);
    [Base64 initialize];
    NSString *strEncoded = [Base64 encode:data];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setHTTPMethod:@"POST"];
    [request setURL:[NSURL URLWithString:@"http://localHost:8080/test2/sss/users/1/uploadImage"]];
   NSData* image=   [strEncoded dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES ];
    NSLog(@"%@",strEncoded);
    [request setHTTPBody:image];
     (void)[NSURLConnection connectionWithRequest:request delegate:self];

再次抱歉,但问题是我不知道我是否匹配正确的参数

【问题讨论】:

  • 你总是可以使用像 AFNetworking 这样的第三方库:stackoverflow.com/questions/19261481/…
  • 我个人更喜欢实现自己的东西,因为在大多数情况下,您可能需要提供的代码的 10%。 AFNetworking 在这里,不过 :) github.com/AFNetworking/AFNetworking
  • 服务器有回复吗?
  • 是的,有回复,我可以确切地知道问题出在哪里:服务器希望找到包含在 url 数据中的 base64 字符串,但在我的情况下,他找不到那个字符串包含在 C# 案例中的 NSData“图像”中,服务器在 NameValueCollection“数据”中找到它我希望我足够解决问题
  • @Rudiger 我把问题说得更清楚了吗???

标签: ios iphone objective-c ios6


【解决方案1】:

您不必对日期进行 base64 编码,而是为您的请求使用正确的内容类型。我不明白你的问题,但这是我的工作方法:

- (NSURLConnection *)connectionByFormUploadingData:(NSData *)data toURL:(NSURL *)url withFileName:(NSString *)fileName forFieldName:(NSString *)fieldName delegate:(id)delegate {
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"POST"];

    NSString *boundary = [[NSProcessInfo processInfo] globallyUniqueString];
    [request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];

    NSMutableData *postData = [[NSMutableData alloc] initWithData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n\r\n", fieldName, fileName ?: @"empty_file_name"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:data];
    [postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [request setHTTPBody:postData];

    return [[NSURLConnection alloc] initWithRequest:request delegate:delegate startImmediately:NO];
}

编辑

假设您使用 PHP,您可以这样保存数据:

move_uploaded_file($_FILES['fieldName']['tmp_name'], $upload_dir.'/'.$_FILES['fieldName']['name']);

编辑二

HTTP 正文中的最后一个边界必须使用 RFC1341 中所述的两个连字符终止,感谢 CouchDeveloper 的改进!

【讨论】:

  • 不幸的是我没有使用PHP,服务器是使用java构建的,Web服务很安静,我不完全知道在服务器端保存数据的机制,但我把C#代码放到尽可能解决问题
  • 好的,但是您的问题出在 Obj-C 中,所以我认为服务器端将是另一个问题。上面的代码是从我写的一个类中提取出来的,我用它来构建一个基于它的 REST 客户端类。所以这段代码非常适合与 REST API 一起使用
  • 非常感谢,我知道问题不够清楚,但我尽量关闭它,希望你的代码能解决我的问题,我会试试看。跨度>
  • 是的,试一试,让我们保持最新状态。实际上,如果代码不起作用,您还有其他问题,可能是服务器端。
  • 我想是的,我试一试,但同样的错误发生在服务器端,再次抱歉谈论 C# 但强制原因我说它有效,所以我想知道我是否可以制作一个与 C# 代码比较,所以我可以实现相同的功能
【解决方案2】:

尝试对您的数据进行一些不同的编码:

[strEncoded dataUsingEncoding:NSUTF8StringEncoding]

【讨论】:

    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多