2011-09-01 1 views
0

У меня есть настройка, в которой я использую ASIHttpRequest для вызова службы в фоновом подклассе NSOperation. Я вызываю метод из моего main() в NSOperation и прохожу этот метод и строю свой запрос с соответствующим URL, заголовками, телом и т. Д. Проблема в том, что я иногда вижу, что тело запроса установлено в null вместо ожидаемое значение. Я распечатываю, что ожидаемое тело должно быть правильно, прежде чем устанавливать его в запрос, и это представление НЕ равно нулю, поэтому я не знаю, где/как будет высвобождаться тело запроса для ASIHttpRequest.Тело сообщения ASIHttpRequest имеет значение null, иногда при создании через NSOperation

Вот пример кода того, как я устанавливаю тело запроса ... этот метод вызывается другим методом драйвера, который контролирует весь рабочий процесс сети. Этот метод, в свою очередь, вызывается методом main() моего NSOperation.

+ (ASIHTTPRequest*) buildRequestForProjectModify: (ANVideoProject*) theProject { 

    if (theProject.selfUrl == nil) return nil; //Can't do anything if we don't have a project url. 

    NSString* projectPutUrl = theProject.selfUrl; 
    ASIFormDataRequest* request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:projectPutUrl]]; 
    [ANAppsServiceHelper addStandardHeadersToRequest:request]; 

    NSDictionary* projectDict = [theProject jsonFriendlyForSaveAndPreview]; 
    ANLogInfo(@"\n\nProject Post body: \n%@\n\n", projectDict); //This will print out ok 
    ANLogInfo(@"\n\nProject Post Body as JSON\n%@\n\n", [projectDict JSONRepresentation]); //this too prints out ok. 
    NSString* jsonRep = [projectDict JSONRepresentation]; 
    NSData* pd = [jsonRep dataUsingEncoding:NSUTF8StringEncoding]; 
    [request appendPostData:pd]; 
    [request setRequestMethod:@"PUT"]; 


    return request; //I have a problem in the calling method from here where the request body is now null. 
} 

Я читал вокруг о создании autorelease бассейна в главном методе моего NSOperation подкласса, и поэтому я делаю, что в верхней части основного метода. Когда я это сделал, возникновение (null) для тела запроса было смягчено, но все же произошло примерно 1/4 времени, когда я вызывал эту операцию. Странно то, что ни одна другая часть запроса никогда не получает нулевой случайным образом (т. Е. Метод запроса или заголовки). Вот выход журнала из метода драйвера я упоминаю выше распечатывания запрос, который был возвращен:

Here is Modify the request: https://<service-url>/projects/p0FvVjc790MFWduhhqUStA 
Here is the request headers: { 
    Accept = "application/json"; 
    "Accept-Encoding" = gzip; 
    Authorization = "Bearer <key>"; 
    "Content-Length" = 293; 
    "Content-Type" = "application/json"; 
    "User-Agent" = "iPhone (OS 4.3.2)"; 
} 
Here is the request method: PUT 
Here is the request body: (null) 

Update:

Так одна вещь, которую я заметил, что иногда тело запроса является недействительным и также иногда есть некоторые данные мусора, добавленные к концу тела запроса (а иногда тело запроса полностью прекрасное). Еще более странно, что запрос действительно проходит успешно с телом, который я намеревался добавить (даже если распечатка выглядит плохо). Это говорит о том, что все в порядке в ASIHttpRequest, но, возможно, что-то происходит с тем, как я печатаю состояние моего запроса или какую-то другую проблему между ASIHttpRequest и библиотекой SBJSon, которую я использую, что заставляет запрос выглядеть поврежденным со временем (хотя это, по-видимому, нет).

ответ

0

Вы распечатывали содержимое pd (NSData *)? Является ли размер очень большим? Затем вам может потребоваться передать данные с диска:

[request setRequestMethod:@"PUT"]; 
[request setPostBodyFilePath:@"/Users/ben/Desktop/another-big-one.txt"]; 
[request setShouldStreamPostDataFromDisk:YES]; 
+0

Размер не большой .. никаких изображений или всего лишь несколько строк текста. – Faisal