私がかなり前向きである私の問題は単純です、私はただ何かを逃しているに違いありません..ただ何がわからないのです。
きめ細かい要素(これ=そのようなもの)に対してGETとPOSTを送信できますが、データも送信する必要があるWebサービス呼び出しは、「キー」のない生のJSONブロックを取ります
これが私が書いた方法です:
-(NSData *)execute {
// Smart Chooser ?
if(PostData.count >0 || Payload != nil)
[self setMethod:UPLINK_METHOD_POST];
else
[self setMethod:UPLINK_METHOD_GET];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:self.connectionUrl
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:10];
if([UPLINK_METHOD_GET isEqualToString:self.connectionMethod])
[request setHTTPMethod:@"GET"];
else
[request setHTTPMethod:@"POST"];
NSString *gData = [self compileGetData];
NSString *pData = [self compilePostData];
// if we have get data, set it into the URL string
if(GetData.count > 0) {
[self setURLWithString:[[self.connectionUrl absoluteString] stringByAppendingString:[@"?" stringByAppendingString:gData]]];
[request setURL:self.connectionUrl];
}
// if we have post data, set it in the body
if(PostData.count > 0) {
const char *bytes = [[NSString stringWithString:pData] UTF8String];
[request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]];
}
// Override any post data if a payload is already defined.
if(Payload != nil) {
[request setHTTPBody:[Payload dataUsingEncoding:NSUTF8StringEncoding]];
}
NSLog(@"URL : %@", request.URL);
NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
if(err != nil)
NSLog(@"here was an error: %@", err);
return responseData;
}
-(NSDictionary *)executeAsJSON
{
NSData *responseData = [self execute];
NSError *e;
return [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&e];
}
OK SO、これが機能する方法は、GetData、PostData、およびPayload変数で提供されるデータに応じて、要求がPOSTであるかGETであるかを自動的に設定することです。
リクエストはデフォルトでGETですが、PostDataまたはPayloadに何かが含まれている場合はPOSTになります。
そしてほとんどの場合compileGetData
、compilePostData
情報の配列を組み合わせたフォーマットされた文字列を戻すだけで、特別なことは何もありません。
しかし、それは問題がどこにあるかではありません。
「Payload」は「PostData」に含まれていたものをすべてオーバーライドします。PostData要素をクラスに提供した場合、それが存在する場合は、提供されたペイロードによってオーバーライドされます。
直線的に提供される情報ではなく、現在存在する「ワークエリア」を示すために、これを提供する必要がありました。
これは関心のある分野です:
// Override any post data if a payload is already defined.
if(Payload != nil) {
//const char *plbytes = [[NSString stringWithString:Payload] UTF8String]; // this didn't work
[request setHTTPBody:[Payload dataUsingEncoding:NSUTF8StringEncoding]]; // inline, doesn't work either
}
私が「機能しない」と言うとき、私が意味するのは、基本的に「ねえ、ペイロードはどこですか?」を意味するWebサービスからエラーJSON配列を返すことです。リクエストがPOSTでない場合は、一般的なエラーとして返されるため、すべてが機能しているので、URLは明らかに正しいです。
私はRESTConsoleforChromeを使用してWebサービスをテストし、正しく機能することを確認しました。
また、デバッガーを介して送信する正確なペイロードを確認し、それをコピーしてRESTConsoleに貼り付けたところ、そこで機能します。
私は..正直なところここで途方に暮れています...