iOS(目标c)将带有json的post请求发送到php后端

Posted

技术标签:

【中文标题】iOS(目标c)将带有json的post请求发送到php后端【英文标题】:iOS (objective c) send post request with json to php backend 【发布时间】:2016-08-10 11:09:43 【问题描述】:

我在 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);
];

我在后端的代码(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(); 

?>

如果我回显 $content,iOS 收到的响应将是一些十六进制数字。即 3c21444f 43545950(json 字符串的十六进制数从尾部到头部由“&”符号连接,即三=四&一=二)。如果我回显 $decoded,它会返回一个空的 json。

如果我尝试解码 Post 请求收到的 json,它会失败。我认为接收到的对象可能是 json_decode 函数的输入。

我应该重写我的 iOS 代码或 PHP 代码还是两者兼而有之?

【问题讨论】:

你设置错了这一行: NSString * some_str = @"\"one\":\"two",\"three\":\"four\""; '\' 的原因没有放在两个之后,请检查您的数据。 @BhadreshKathiriya 这是一个错字。我会纠正它。谢谢。 为什么要通过NSString来构造参数?你执行 NSString => NSData => NSDictionary,AFHTTPSessionManager 将执行 NSDictionary => NSData。 我猜你可以用邮递员测试你的 php 代码,这将缩小对 bug 的搜索范围 谢谢大家!我自己解决了这个问题! 【参考方案1】:

试试这个...可能有帮助

创建一个方法并将参数传递给该方法

+ (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);
];

谢谢...

【讨论】:

你能告诉我为什么吗? 为了代码可重用的目的..只要你想把值传递给那个方法。 我认为这不是问题所在。不过谢谢。我会记住这一点。

以上是关于iOS(目标c)将带有json的post请求发送到php后端的主要内容,如果未能解决你的问题,请参考以下文章

使用 alamofire 将带有 JSON 对象和查询参数的 POST 请求发送到 REST Web 服务

带有包含数组的 Json 的 C# POST 请求

使用 POST 请求 iOS Swift 3 发送嵌套 JSON

在 Android 的 OKhttp 中通过 POST 请求发送 JSON 正文

使用 Volley 发送带有 JSON 数据的 POST 请求

在 Laravel 中发送带有 json 对象数据的 post 请求