我有一个设置,我正在使用ASIHttpRequest在后台NSOperation子类中进行服务调用。我从NSOperation中的main()调用一个方法,并使用适当的URL,标题,正文等来构建我的请求。问题是我偶尔会看到请求体设置为null而不是期望值。在将其设置为请求之前打印出预期正文应该是什么,并且该表示形式为非null,因此我不知道ASIHttpRequest的请求主体在何处/如何被释放。
以下是我如何设置请求体的示例代码...此方法由另一个控制整个网络工作流的驱动程序方法调用。反过来,该方法由我的NSOperation的main()方法调用。
+ (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子类的main方法中设置自动释放池的问题,所以我在main方法的顶部做了这个。当我这样做时,请求体的(null)的出现被减轻了,但是仍然发生了大约1/4的时间我调用了这个操作。奇怪的是,请求的其他部分似乎没有以这种随机方式(即请求方法或标头)设置为null。这是我在上面提到的驱动程序方法的日志输出,打印出返回的请求:
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)
更新
所以我注意到的一件事是,有时请求体是空的,有时在请求体的末尾添加了一些垃圾数据(有时请求体完全没问题)。更奇怪的是,请求实际上总是成功通过我想要添加的正文(即使打印输出看起来很糟糕)。这表明ASIHttpRequest中的事情还可以,但是可能会出现我如何打印出我的请求状态或ASIHttpRequest与我正在使用的SBJSon库之间的其他问题,导致请求看起来已损坏的时间到时间(即使它显然不是)。
答案 0 :(得分:0)
您是否打印出pd(NSData *)的内容?尺寸很大吗?然后,您可能需要从磁盘传输数据:
[request setRequestMethod:@"PUT"];
[request setPostBodyFilePath:@"/Users/ben/Desktop/another-big-one.txt"];
[request setShouldStreamPostDataFromDisk:YES];