AFNetworking загрузка файлов работает с моим PHP-скриптом, но не работает с JSP-скриптом - PullRequest
0 голосов
/ 07 ноября 2011

Я пишу приложение для iPhone, которое отправляет некоторую информацию (текст и изображение) на серверный скрипт.

с моим php-скриптом все работает хорошо, но с jsp-скриптом моего клиента (который отправляет электронное письмо с полученной информацией на адрес электронной почты) ничего не работает ... (я знаю, потому что я должен получить автоответчик, и это не ' не бывает).

У меня нет доступа к сценарию моего клиента, потому что он крупный клиент и "некоторые бла-бла вопросы безопасности ..." скрипт корректно работает с онлайн-формой и хорошо работает с ASIHTTPRequest на iOS 4.3 (я перехожу на AFNetworking, потому что с iOS 5 ASIHTTPRequest не работает)

любая помощь очень ценится !!!

вот мой код ... обратите внимание, что мой код всегда достигает NSLog (@ "Success"), но я не получаю никаких писем с автоответчиком, поэтому он не работает !!

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://my.client.server.com"]];


    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    [parameters setObject:[fieldName text] forKey:@"field01_nome"];
    [parameters setObject:[fieldSurname text] forKey:@"field02_cognome"];



    NSMutableURLRequest *myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/Contents/mail/sendToForm.jsp" parameters:parameters constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
        [formData appendPartWithFileData:myNSDataToSend mimeType:@"image/jpeg" name:@"alleagto"];
    }];


    AFHTTPRequestOperation *operation = [AFHTTPRequestOperation HTTPRequestOperationWithRequest:myRequest success:^(id object) {
        NSLog(@"Success");

    } failure:^(NSHTTPURLResponse *response, NSError *error) {
        NSLog(@"Fail");

    }];


    [operation setUploadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
        NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite);

    }];

    queue = [[[NSOperationQueue alloc] init] autorelease];
    [queue addOperation:operation];

Большое спасибо !!

РЕДАКТИРОВАТЬ: В соответствии с предложением JosephH я добавил захваченные запросы:

Запрос, сгенерированный из онлайн-формы (работает всегда):

POST /Contents/mail/sendToForm.jsp HTTP/1.1
Host: my.client.server.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22
Content-Length: 54246
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  */<- added by me for syntax coloring
Origin: http://www.client.server.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLWVo7zrkX3QOybWm
Referer: http://www.client.server.com/form/1/send-the-form.shtml
Accept-Language: it-it
Accept-Encoding: gzip, deflate
Pragma: no-cache
Connection: keep-alive

------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="form_recipient"

4182fd0f318e1d86176a3be7f8c7d83955eb5eca2e1402250e47164caf1984e7
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="form_subject"


------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field01_nome"

Gianluca
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field02_cognome"

Pisati
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field03_indirizzo"

A
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field04_provincia"

B
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field05_email"

my_email@gmail.com
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field06_telefono"

333
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field07_tipo"

valore2
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="allegato"; filename="allegato.jpg"
Content-Type: image/jpeg

Here there's the attachment

------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field09_oggetto"

Test Web
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field10_segnalazione"

Send Test Web
------WebKitFormBoundaryLWVo7zrkX3QOybWm--

Запрос, сгенерированный из iOS 5.0 с ASIHTTP (я не знаю почему, но иногда он работает, а иногда нет ...)

POST /Contents/mail/sendToForm.jsp HTTP/1.1
Host: my.client.server.com
User-Agent: My App 1.0 (iPhone Simulator; iPhone OS 5.0; en_US)
Content-Length: 153522
Content-Type: multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Accept-Encoding: gzip
Connection: close

--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field01_nome"

Gianluca
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field02_cognome"

Pisati
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field03_indirizzo"

A
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field04_provincia"

B
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field05_email"

gianluca.pisati@gmail.com
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field06_telefono"

333
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field07_tipo"

valore2
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field09_oggetto"

Test iOS 5
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field10_segnalazione"

ASIHTTP on iOS 5
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="form_recipient"

4182fd0f318e1d86176a3be7f8c7d83955eb5eca2e1402250e47164caf1984e7
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="form_subject"


--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="allegato"; filename="image.jpg"
Content-Type: image/jpeg

Here there's the attachment

--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D--

Запрос, сгенерированный из iOS 5.0 с AFNetworking (который никогда не работает):

POST /Contents/mail/sendToForm.jsp HTTP/1.1
Host: my.client.server.com
User-Agent: com.mycompany.myapp/1.0 (unknown, iPhone OS 5.0, iPhone Simulator, Scale/1.000000)
Content-Length: 153203
Accept: */*                     */<- added by me for syntax coloring
Accept-Language: en, fr, de, ja, nl, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8
Accept-Encoding: gzip
Content-Type: multipart/form-data; boundary=Boundary+0xAbCdEfGbOuNdArY
Connection: keep-alive


--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="form_recipient"

4182fd0f318e1d86176a3be7f8c7d83955eb5eca2e1402250e47164caf1984e7
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field04_provincia"

B
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field05_email"

gianluca.pisati@gmail.com
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field07_tipo"

valore2
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field01_nome"

Gianluca
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field10_segnalazione"

AFNetworking on iOS 5
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field02_cognome"

Pisati
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="form_subject"


--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field06_telefono"

333
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field09_oggetto"

Test iOS 5
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field03_indirizzo"

A
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="allegato"; filename="allegato-342447627.jpeg"
Content-Type: image/jpeg

Here there's the attachment

--Boundary+0xAbCdEfGbOuNdArY--

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Также есть проблема с AFNetworking и multipart / form-data. Решаемые. Когда AFNetworking генерирует тело HTTP для multipart / form-data, он помещает \ r \ n символы в начало. Разница между вашим телом AFNetworking и другими телами - это в начале. Попробуйте удалить это. Я изменил некоторые методы AFHTTPClient.m, чтобы удалить их из начала тела:

static inline NSString * AFMultipartFormEncapsulationBoundary() {
    return [NSString stringWithFormat:@"%@--%@%@", @""/*kAFMultipartFormLineDelimiter*/, kAFMultipartFormBoundary, kAFMultipartFormLineDelimiter];

}

и

- (void)appendPartWithHeaders:(NSDictionary *)headers body:(NSData *)body {
    [self appendString:AFMultipartFormEncapsulationBoundary()];

    for (NSString *field in [headers allKeys]) {
        [self appendString:[NSString stringWithFormat:@"%@: %@%@", field, [headers valueForKey:field], kAFMultipartFormLineDelimiter]];
    }

    [self appendString:kAFMultipartFormLineDelimiter];
    [self appendData:body];
    [self appendString:kAFMultipartFormLineDelimiter];

}

У меня работает

0 голосов
/ 07 ноября 2011

ASIHTTPRequest прекрасно работает на iOS 5.0;100 приложений, использующих ASIHTTPRequest, не имеют проблем на iOS 5.

Тем не менее, переход на AFNetworking, вероятно, имеет смысл в долгосрочной перспективе.

Эти «это работает в браузере, но не с»Проблемы с типами трудно решить с помощью проверки кода - самый простой способ их решения - установить такой инструмент, как charlesproxy.

После установки запустите его захват, затем выполните запрос в браузере, убедитесь, что он был успешным,затем выполните это из симулятора iOS.Затем сравните запрос от браузера с запросом от AFNetworking и посмотрите, какие различия вы можете заметить.

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

...