Http request传输图片和附属信息(old)

在iOS应用开发中,遇到通过HTTP请求同时传输图片和JSON格式的附属信息的问题。当图片以二进制存储在请求body中,JSON数据放入header时,服务器端解析JSON时因中文字符导致报错。为解决此问题,采用对汉字进行UTF编码,将中文转换为16进制字符串。Objective-C编码示例显示了这种转换过程,但其输出的16进制表示与Java不完全兼容。在Java端接收时,需要对 Oc编码后的字符串进行特定处理,将百分号转换为反斜杠x,且保留未编码的拉丁字符。这样,可以正确地解码并还原混合传输的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在MeToo的研发过程中,部分模块需要使用http请求向服务器同时传输图片和一些附属信息。由于图片使用NSDATA格式传输,附属信息使用JSON格式传输,而消息的body只能支持其中一种格式,因此在只要传输JSON信息的时候,使用UTF8编码传输;在需要同时传输图片和附属信息时,将图片以二进制格式放在body里,附属信息的JSON放在header里,如下所示:

[[SVHTTPClient sharedClientWithIdentifier:@"upload"] setValue:_delegate.userID forHTTPHeaderField:@"userid"];
。。。。。。
[[SVHTTPClient sharedClientWithIdentifier:@"upload"]POST:POSTVOTE_SERVLET parameters:[NSDictionary dictionaryWithObjectsAndKeys:
                 imageData, @"image",
                 nil]
            completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) { …… }];

       但这里有个问题,在httpheader中设置的编码格式只对body起作用,header本身只支持ascii的文本,如果将中文放在header中(即使用JSON包装也一样),传到服务器端后服务器解析不出来,从而报JSON格式错误。

       解决方法是,对汉字进行UTF编码,得到类似16进制的文本串,在作为JSON的数据传输。Objectivec中的代码为:

NSString *str = @"中国1美国a23";
NSString *unicodeStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", unicodeStr);

       输出结果为:

%E4%B8%AD%E5%9B%BD1%E7%BE%8E%E5%9B%BDa23

 

       该结果有两点问题:

1,        oc只能用”%”来标记一个字节的16进制数,而java的写法是”\x”

2,        对于latin字符,如示例中的1,2,3,a,oc不会对其进行编码,而如果用JAVA的UTF8编码会将”1”编码成”\x31”的形式

因此在还原时,不能对oc编码后的结果直接还原,而需要先将%E4替换为\xE4的形式(其实是转成0XE4形式),对于没有替换的latin字符则直接读入不做任何处理。

服务器端的java代码如下:

	public static String hex2Str(String str) throws UnsupportedEncodingException {
        byte[] byteArr = new byte[1024];
        int num=0;
        for (int i = 0; i < str.length();) {
        	if (str.charAt(i)=='%'){
        		Integer hexInt = Integer.decode("0x" + str.charAt(i+1) + str.charAt(i+2));
        		byteArr[num] = hexInt.byteValue();
        		i+=3;
        		num++;
        	}else{
        		byteArr[num] = (byte)str.charAt(i);
        		num++;
        		i++;
        	}
        }
        byteArr[num] = '\0';
 
        return new String(byteArr, "UTF-8");
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值