4

まず、PUT リクエストの場合、リクエスト パラメーターをリクエスト ボディで渡す必要があることに気付きました。ただし、PUT 要求のクエリ文字列として要求パラメーターが追加されることを期待する API (開発ではなく、使用しているだけです) を使用しています。

AFHTTPClient のサブクラスを利用しています。私が参照している特定の PUT リクエストについては、getPath:parameters:success:failure:を利用します。

これまでに見つけた解決策は、パス変数を手動で作成して、渡したいパラメーターを含めることです。もちろん、これは理想的ではなく、エラーが発生しにくい別のオプションがあるかどうか疑問に思っていました.

つまり、AFHTTPClient (のサブクラス) を使用して PUT 要求を送信し、渡されたパラメーターをクエリ文字列として追加 (およびエンコード) する方法はありますか (GET 要求と同様)。

4

3 に答える 3

4

AFHTTPClient.m内のgetPath:parameters:success:failureメソッドは、requestWithMethod:path:parametersを呼び出します。後者のメソッド内では、HTTPメソッドが特定の値に対してチェックされ、パラメーターをリクエストに追加する方法が決定されます。ご覧のとおり、デフォルトでは、パラメータはGET、HEAD、またはDELETEリクエストの場合にのみURLに追加する必要があります。PUTリクエストの場合もURLに追加する必要があるため、requestWithMethod:path:parametersを次のように変更します。

    - (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
                                      path:(NSString *)path 
                                parameters:(NSDictionary *)parameters 
{   
    NSURL *url = [NSURL URLWithString:path relativeToURL:self.baseURL];
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease];
    [request setHTTPMethod:method];
    [request setAllHTTPHeaderFields:self.defaultHeaders];

    if ([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"]) {
        [request setHTTPShouldUsePipelining:YES];
    }

    if (parameters) {        
        if ([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"] || [method isEqualToString:@"PUT"]) {
            url = [NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:[path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@", AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding)]];
            [request setURL:url];
        } else {
            NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding));
            switch (self.parameterEncoding) {
                case AFFormURLParameterEncoding:;
                    [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];
                    [request setHTTPBody:[AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding) dataUsingEncoding:self.stringEncoding]];
                    break;
                case AFJSONParameterEncoding:;
                    [request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];
                    [request setHTTPBody:[AFJSONStringFromParameters(parameters) dataUsingEncoding:self.stringEncoding]];
                    break;
                case AFPropertyListParameterEncoding:;
                    [request setValue:[NSString stringWithFormat:@"application/x-plist; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];
                    [request setHTTPBody:[AFPropertyListStringFromParameters(parameters) dataUsingEncoding:self.stringEncoding]];
                    break;
            }
        }
    }

    return request;
}
于 2012-07-16T08:23:09.750 に答える
3

基礎となるAFNetworkingコードを変更せずに、datwalkの回答のコードが行っていることを行うことができます。AFNetworking を使用して、URL パラメーターを含むパスを作成します。

NSDictionary *mutableParameters = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"csv",@"format", @"0",@"level", @"2013-10-25", @"keydate", nil];

NSString *urlPath = [NSString stringWithFormat:@"applications/%@/Planning?%@", name, AFQueryStringFromParametersWithEncoding(mutableParameters, NSUTF8StringEncoding)];

NSString *apiFunctionPath = [urlPath stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[self putPath:apiFunctionPath
   parameters:nil
      success:^(AFHTTPRequestOperation *operation, id XML) {
          NSLog(@"%@",XML);
      }
      failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"%@",error);
      }];
于 2013-10-25T19:00:19.553 に答える
1

私の API の場合、AFHTTPClient オブジェクトのエンコーディングを変更すると問題が解決しました。

myAFHTTPClient.parameterEncoding = AFJSONParameterEncoding;
于 2013-06-11T19:58:55.167 に答える