使用Android到Objective - C的多部分表单数据(NSDictionary和图像)

博观而约取,厚积而薄发。这篇文章主要讲述使用Android到Objective - C的多部分表单数据(NSDictionary和图像)相关的知识,希望能为你提供帮助。
下午好!我正在尝试提出类似于此的请求:

public boolean ChangeAvatar(final Bitmap avatarBitmap, final IChangeAvatar handler) { String url = baseUrl + Language.getInstance().getLanguage() + "/my_url"; final JSONObject params = new JSONObject(); try { JSONObject auth = new JSONObject(); auth.put("uid",Long.toString(UserData.getInstance().getUserId())); auth.put("token", UserData.getInstance().getUserToken()); params.put("auth",auth); params.put("act","avatar_change"); } catch (Exception e) { Log.e("network",e.getMessage()); return false; } VolleyMultipartRequest myRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener< NetworkResponse> () { @Override public void onResponse(NetworkResponse response) { try { String responseStr = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); handler.ChangeSuccess(""); //JSONObject resp = new JSONObject(responseStr); Log.d("network", responseStr); } catch (Exception e) { handler.ChangeFailed("error","Error"); Log.d("network", e.getMessage()); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if(error.getMessage()!= null) handler.ChangeFailed("error",error.getMessage()); else { try { String responseStr = new String(error.networkResponse.data, HttpHeaderParser.parseCharset(error.networkResponse.headers)); handler.ChangeFailed("error","errorMessage"); } catch (Exception e) {handler.ChangeFailed("error","errorMessage"); }}} }) { @Override protected Map< String, String> getParams() { Map< String,String> paramsMap = new HashMap< > (); paramsMap.put("json",params.toString()); return paramsMap; }@Override protected Map< String, DataPart> getByteData() { HashMap< String,DataPart> result = new HashMap< > (); ByteArrayOutputStream baos = new ByteArrayOutputStream(); avatarBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); final byte[] byteArrayImage = baos.toByteArray(); result.put("userfile",new DataPart("avatar.jpg",byteArrayImage,"image/jpeg")); return result; } }; myRequest.setRetryPolicy(new DefaultRetryPolicy(5000,0,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); RequestManager.getInstance(context).addToRequestQueue(myRequest); return true; }

但我总是得到一个错误。在我看来,我的问题是我的图像的错误密钥传输。以下是目前的发展情况:
- (IBAction)saveAction:(UIButton *)sender { NSMutableDictionary *auth = [NSMutableDictionary dictionary]; [auth setValue:[UserDefaultsHandler getUserDefaultsValueByKey:@"myId"] forKey:@"uid"]; [auth setValue:[UserDefaultsHandler getUserDefaultsValueByKey:@"token"] forKey:@"token"]; NSMutableDictionary *userDataDictionary = [NSMutableDictionary dictionary]; [userDataDictionary setValue:auth forKey:@"auth"]; [userDataDictionary setValue:@"avatar_change" forKey:@"act"]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:@"myUrl"]]; [request setHTTPMethod:@"POST"]; NSMutableData *body = [NSMutableData data]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSData* imageData = UIImageJPEGRepresentation(self.imageView.image, 1.0f); [body appendData:[[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: form-data; name="userfile"; fileName="avatar.jpg"" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageData]; [body appendData:[@"" dataUsingEncoding:NSUTF8StringEncoding]]; //parameter all_data [body appendData:[[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="all_data""] dataUsingEncoding:NSUTF8StringEncoding]]; NSString *jsonStr = [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:userDataDictionary options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding]; [body appendData:[jsonStr dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"" dataUsingEncoding:NSUTF8StringEncoding]]; // close form [body appendData:[[NSString stringWithFormat:@"--%@--", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the request [request setHTTPBody:body]; NSError *error=nil; NSHTTPURLResponse *response=nil; NSData *urlData=https://www.songbingjia.com/android/[NSURLConnection sendSynchronousRequest:request returningResponse:& response error:& error]; }

答案看看这个,也许有帮助:
NSString *URLPath; //URL NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLPath] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; NSDictionary *questionDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:questionDict options:NSJSONWritingPrettyPrinted error:& error]; NSString *jsonRequest = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSData *requestData = [jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; /* .... .... */ [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[requestData length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody: requestData]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {}]; [task resume];

或者(比这更容易)
【使用Android到Objective - C的多部分表单数据(NSDictionary和图像)】AFNetworking(ios的网络框架)

    推荐阅读