Веб-сервис не получает составной PUT от Android

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

Однако, когда я делаю то же самое с 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());
        }
    });

Для справки, вот код, который я использую в iOS для успешного выполнения того же запроса. Я использую 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];

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


person nserror    schedule 29.02.2016    source источник


Ответы (1)


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

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());
        }
    });
person nserror    schedule 29.02.2016