简体   繁体   English

iOS(目标C)将带有JSON的发布请求发送到PHP后端

[英]iOS (objective c) send post request with json to php backend

My code in iOS: 我在iOS中的代码:

NSString * some_str = @"{\"one\":\"two\",\"three\":\"four\"}";
NSData *objectData = [some_str dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData
                                                     options:NSJSONReadingMutableContainers
                                                       error:&error];  
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager POST:@"https://exmaple.com/post.php" parameters:json progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"Error: %@", error);
}];

My code in backend (PHP): 我在后端的代码(PHP):

<?php
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
    throw new Exception('Request method must be POST!');
}
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if(strcasecmp($contentType, 'application/json') != 0){
    throw new Exception('Content type must be: application/json');
}

//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));
$decoded = json_decode($content, true);
echo $content;


// $responses = array();
header("Content-type: application/json, charset=utf-8");
// echo json_encode($responses);

$conn->close(); 

?>

If I echo $content, the response received by iOS will be some hex number. 如果我回显$ content,iOS收到的响应将是一个十六进制数。 ie 3c21444f 43545950 (hex number for the json string start from the tail to the head connected by a "&" sign, ie three=four&one=two). 即3c21444f 43545950(json字符串的十六进制数字从尾部开始到由“&”符号连接的头部,即三=四和一=二)。 If I echo $decoded, it returns an empty json. 如果我回显$ decoded,它将返回一个空的json。

And if I try to decode the json received by Post request, it failed. 而且,如果我尝试解码Post请求收到的json,则失败。 I believed that the received object was a possible input for json_decode function. 我相信接收到的对象可能是json_decode函数的输入。

Should I rewrite my iOS code or PHP code or both? 我应该重写我的iOS代码或PHP代码,还是两者都重写?

Try this...may helps 试试这个...可能有帮助

Create a method and pass parameters to that method 创建一个方法并将参数传递给该方法

+ (void)apiRequestForPOSTWithServiceName:(NSString *)serviceName andParameters:(NSDictionary *)parameter withCompletion:(void(^)(id response, BOOL isSuccess))completion
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSString *url = [NSString stringWithFormat:@"%@%@", BASE_URL, serviceName];
[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) {
    //NSLog(@"JSON: %@", responseObject);

    completion(responseObject,YES);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);

    completion(error,NO);
}];
}

Thanks... 谢谢...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM