2012-06-26 4 views
1

Итак, вы думаете, что было бы легко найти прямой пример информации POST для ASIFormDataRequest, но я не нашел 1: 1 в этих форматах. Вот запрос POST я хочу отправить:многостраничный запрос POST непосредственно в ASIFormDataRequest

POST /fileXfer HTTP/1.1 
Content-Type: multipart/form-data; boundary=AaB03x 
Content-Length: 200 
AppID:myID 
TransferID:abcd1234 

-- AaB03x 
Content-Disposition: form-data; name="data"; filename="xxx" 
Content-Type: application/octet-stream 
Content-Length: 100 

... contents of file ... 

--AaB03x-- 

EDIT:

Оказывается, мои проблемы были больше с сервера, получающего данные. Но это то, с чем я закончил!

NSURL *url = [NSURL URLWithString:@"http://IP:PORT/fileXfer"]; 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostFormat:ASIMultipartFormDataPostFormat]; 

//Sets headers of POST 
[request addRequestHeader:@"X-Application-Id" value:@"myID"]; 
[request addRequestHeader:@"X-Transfer-Id" value:@"abcd1234"]; 

//Sets data 
NSData *fileData = [NSData dataWithContentsOfFile:kEncryptedFilePath]; 
[request setData:fileData withFileName:@"xxx" andContentType:@"application/octet-stream" forKey:@"data"]; 

[request setDelegate:self]; 
[request startAsynchronous]; 

Я также добавил следующую строку в buildMultipartFormDataPostBody ASIFormDataRequest, где Content-Disposition и Content-Type устанавливаются:

[self appendPostString:[NSString stringWithFormat:@"Content-Length: %lu\r\n\r\n", [data length]]];` 

я не уверен, если есть более простой способ, чтобы добавить эту строку непосредственно из просьба, но из того, что я пробовал, казалось, это работала.

ответ

0

Вместо того, чтобы вручную создавать тело HTTP, что может привести к ошибкам, лучше использовать методы, предоставляемые ASIFormDataRequest.

NSURL *url = [NSURL URLWithString:@"http://IP:PORT/fileXfer"]; 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 

[request addRequestHeader:@"X-Application-Id" value:@"myID"]; 
[request addRequestHeader:@"X-Transfer-Id" value:@"abcd1234"]; 

[request setData:[self fileData] withFileName:@"xxx" andContentType:@"application/octet-stream" forKey:@"data"]; 

[request setDelegate:self]; 
[request startAsynchronous];
+0

Спасибо за ваш ответ. Что вы сказали, имеет смысл оставить Content-Length и Content-Type, потому что они заполнены ASIFormDataRequest. Тем не менее, я не могу проверить содержимое тела, и это похоже на то, где моя ошибка все еще происходит. Есть ли способ проверить этот контент? Я попытался использовать setData, addData, setFile и addFile вместо строки 'setData' выше. – Katie

+0

Вы можете отправить 'buildPostBody' в запрос, затем прочитать свойство' postBody'. –

+0

Я все еще, кажется, получаю (null) для postBody, когда я это делаю. Однако, если я печатаю 'fileData' в конце' addData' (который вызывается 'setData'), содержимое включает contentType, мои данные, имя файла и ключ. – Katie

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