0

私がかなり前向きである私の問題は単純です、私はただ何かを逃しているに違いありません..ただ何がわからないのです。

きめ細かい要素(これ=そのようなもの)に対して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になります。
そしてほとんどの場合compileGetDatacompilePostData情報の配列を組み合わせたフォーマットされた文字列を戻すだけで、特別なことは何もありません。

しかし、それは問題がどこにあるかではありません。

「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に貼り付けたところ、そこで機能します。

私は..正直なところここで途方に暮れています...

4

1 に答える 1

1

Try using a web proxy like Charles or Wireshark (I personally preferr Charles due to it's ease of use, it's a 30-day trial though) and monitor the request you make from RESTConsole and the one you make from your app and see if they look the same.

Check any headers, line returns and anything else that looks different.

That's the best I can think of to start with

于 2012-11-23T19:37:19.387 に答える