Тело сообщения ASIHttpRequest иногда пусто при сборке через NSOperation - PullRequest
0 голосов
/ 01 сентября 2011

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

Вот пример кода того, как я устанавливаю тело запроса ... этот метод вызывается другим методом драйвера, который контролирует весь сетевой рабочий процесс. Этот метод, в свою очередь, вызывается методом 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. 
}

Я читал о настройке пула автоматического выпуска в основном методе моего подкласса 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)

Обновление:

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

1 Ответ

0 голосов
/ 02 сентября 2011

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

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