2016-02-29 2 views
1

Я пытаюсь загрузить файл PDF в веб-службу через PUT. Я достигаю этого на iOS с помощью запроса на множественную форму.Webservice не получает multipart PUT от android

Однако, когда я делаю то же самое с Android, служба возвращает 200 сразу и никогда не получает весь PUT, и я не могу понять, почему. Я попытался построить этот запрос несколькими разными способами, все с одинаковым результатом.

настоящее время я использую библиотеку loopj AsyncHTTPClient, чтобы сделать запрос, вот мой код:

MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 

    ByteArrayBody body = new ByteArrayBody(bytes, ContentType.create("application/pdf"), "file.pdf"); 

    builder.addPart("",body); 
    HttpEntity form = builder.build(); 

    AsyncHttpClient client = new AsyncHttpClient(); 
    client.setBasicAuth(authUser(), authPass()); 

    client.put(context, url, form, "application/pdf", new AsyncHttpResponseHandler() { 
     @Override 
     public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 

      Log.d(TAG,"SUCCESS: " + statusCode + " response: " + responseBody.length); 
     } 

     @Override 
     public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
      Log.e(TAG,"FAIL: " + statusCode + " response: " + responseBody + " ERROR: " + error.getMessage()); 
     } 
    }); 

Для справки, вот код, я использую на прошивкой, чтобы сделать такой же запрос - с успехом. С этой целью я использую AFNetworking.

NSString *authStr = [NSString stringWithFormat:@"%@:%@", [self authUser], [self authPass]]; 
    NSString *authenticationValue = [[authStr dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0]; 

    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"PUT" URLString:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
     [formData appendPartWithFileData:data 
            name:@"" 
           fileName:@"" 
           mimeType:mimeType]; 
    } error:nil]; 

    [request setValue:[NSString stringWithFormat:@"Basic %@", authenticationValue] forHTTPHeaderField:@"Authorization"]; 


    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

    NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 

     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 

     if(progress.cancelled) { 
      completion(nil, (int)httpResponse.statusCode, [NSError errorWithDomain:@"Network.uploadFile" code:500 userInfo:@{NSLocalizedDescriptionKey:@"User Cancelled"}]); 
     } else { 
      if (error) { 
       completion(nil, (int)httpResponse.statusCode, error); 
      } else { 
       NSDictionary *response = responseObject; 
       completion(response, (int)httpResponse.statusCode, nil); 
      } 
     } 
    }]; 



    _currentUploadTask = uploadTask; 
    [uploadTask resume]; 

Любые мысли приветствуются. Или, возможно, указать мне в направлении, для которого я мог бы отладить это лучше? Благодарю.

ответ

0

Я решил эту проблему, добавив границы к многочастной сущности и изменению типа содержимого запроса на

multipart/form-data; boundary= 

Вот обновленная рабочим код

MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 

    String boundary = "-------------" + System.currentTimeMillis(); 
    builder.setBoundary(boundary); 

    ByteArrayBody body = new ByteArrayBody(bytes, ContentType.create("application/pdf"), "file.pdf"); 

    builder.addPart("",body); 
    HttpEntity form = builder.build(); 

    AsyncHttpClient client = new AsyncHttpClient(); 
    client.setBasicAuth(authUser(), authPass()); 

    String type = "multipart/form-data; boundary="+boundary; 

    client.put(context, url, form, type, new AsyncHttpResponseHandler() { 
     @Override 
     public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 

      Log.d(TAG,"SUCCESS: " + statusCode + " response: " + responseBody.length + " headers: " + headers.toString()); 
     } 

     @Override 
     public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
      Log.e(TAG,"FAIL: " + statusCode + " response: " + responseBody + " ERROR: " + error.getMessage()); 
     } 
    }); 

 Смежные вопросы

  • Нет связанных вопросов^_^