请求正文中的 POST JSON 字符串(不在 URL-Form-Encoded 请求中) AFNetworking

Posted

技术标签:

【中文标题】请求正文中的 POST JSON 字符串(不在 URL-Form-Encoded 请求中) AFNetworking【英文标题】:POST JSON string in request body (not in URL-Form-Encoded Request) AFNetworking 【发布时间】:2015-05-04 18:31:00 【问题描述】:

我想使用 AFNetworking POST 请求向服务器发送 JSON 字符串。 目前我正在尝试以下代码

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

NSData * data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPBody:data];

[request setTimeoutInterval:120];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.requestSerializer = [AFJSONRequestSerializer serializer];

AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject)

        NSLog(@"JSON: %@", responseObject);

 failure:^(AFHTTPRequestOperation *operation, NSError *error)



    NSLog(@"Error: %@", error);

];

[operation start];`

什么都没有发生。代码既没有进入成功区块,也没有进入失败区块。可能是什么原因?在 AFNetworking 2 中有没有其他方法可以做到这一点。 注意:请求在 POSTMAN 上运行良好,并在 500 毫秒内返回响应。

【问题讨论】:

【参考方案1】:

这是我的工作代码

NSDictionary *parameters = [NSDictionary dictionary];//set values here

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];

[manager POST:@"http://example.com/api" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
    //Do success code
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    //do failure code
];

这是配置HTTP body AFJSONRequestSerializer的函数

#pragma mark - AFURLRequestSerialization

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                           withParameters:(id)parameters
                                    error:(NSError *__autoreleasing *)error

    NSParameterAssert(request);

    if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) 
        return [super requestBySerializingRequest:request withParameters:parameters error:error];
    

    NSMutableURLRequest *mutableRequest = [request mutableCopy];

    [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) 
        if (![request valueForHTTPHeaderField:field]) 
            [mutableRequest setValue:value forHTTPHeaderField:field];
        
    ];

    if (parameters) 
        if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) 
            [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        

        [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
    

    return mutableRequest;

您正在使用 AFJSONRequestSerializer 作为请求序列化程序,这意味着您从 NSDictionary 发送 JSON 字符串作为 HTTP 正文

[mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
    

所以你需要做的就是从 JSON 值生成 NSDictionary,然后像上面那样调用。 无需制作 JSON 字符串。

【讨论】:

发送原始数据? 原始数据有什么关系?这很大程度上取决于 Web 服务的编写方式。 我想发送一个 JSON 字符串而不是参数(NSDictionary)。 我现在有点困惑 vichevstefan :)。我已经多次使用 AFNetworking POST 方法。现在我应该如何处理第二个和第三个代码 sn-p?我对第一个代码 sn-p 有完整的了解。我已经有一个 NSDictionary 可以转换为 JSON 字符串 2、3代码sn-p是AFNetworking如何实现请求序列化的解释。

以上是关于请求正文中的 POST JSON 字符串(不在 URL-Form-Encoded 请求中) AFNetworking的主要内容,如果未能解决你的问题,请参考以下文章

如何将 json 列表传递给 Flutter 中的 http 请求(post)正文?

在 Swift 中使用 JSON 正文发出 HTTP Post 请求

如何通过 Windows 批处理脚本中的 curl 发送带有 json 正文的 POST 请求

从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题

Node.js/ Express POST 请求正文被解析为不正确的 JSON

在 Azure API 管理器中验证 POST 请求正文