![](/img/trans.png)
[英]PHP not receiving post data from my iPhone simulator using AFNetworking
[英]JSON format issue in PHP REST service receiving POST from AFNetworking 2.0
我遇到的情況是,我使用AFNetworking 2.0代碼從iOS代碼中發布了JSON字符串。 我的客戶代碼如下:
NSURL *url = [NSURL URLWithString:BaseURLString];
NSString *jsonString = [[NSString alloc] initWithData:jsonPayloadForProject encoding:NSUTF8StringEncoding];
NSDictionary *parameters = @{@"project": jsonString};
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[manager POST:@"service.php" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@", [responseObject description]);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"POST JSON for Project Error"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
}];
JSON如下所示:
{
"Maps" : [
{
"Markers" : [
{
"marker_tag" : -790386438,
"location_y" : 182,
"location_x" : 344
},
{
"marker_tag" : 451496476,
"location_y" : 267,
"location_x" : 150.5
}
],
"image_string" : "EC817509-DE49-4914-840E-5E407571F6AE.jpeg",
"order_num" : 0,
"name" : "Blah1",
"id" : "EC817509-DE49-4914-840E-5E407571F6AE"
},
{
"Markers" : [
{
"marker_tag" : -79601351,
"location_y" : 377,
"location_x" : 486.5,
"image_id" : "Blah2",
"map_id" : "146C1C09-5AE0-4E4C-83C8-B7EAA8F28A9A"
}
],
"image_string" : "146C1C09-5AE0-4E4C-83C8-B7EAA8F28A9A.jpeg",
"order_num" : 0,
"name" : "1st floor",
"id" : "146C1C09-5AE0-4E4C-83C8-B7EAA8F28A9A"
}
],
"longitude" : "-222.222222",
"latitude" : "33.33333"
}
當我使用php代碼讀取服務器上的JSON字符串時
$json_str = file_get_contents('php://input');
當我這樣做時,我得到以下字符串:
{ "project" = '{ \n \"Maps\" : [ \n { \n \"Markers\" : [ \n { \n \"marker_tag\n : = -790386438, \n ....
我的問題是,當我執行以下操作時,我一無所獲。
$array_str = json_decode($json_str, true);
將其放入數組以解析數據的最佳方法是什么? 如何獲取我從客戶端發送的原始JSON字符串?
幾個問題
您的AFHTTPSessionManager
使用默認的AFJSONResponseSerializer
但僅覆蓋acceptableContentTypes
。 僅當服務器代碼確實返回JSON並且未能在Content-Type
標頭中指定時,才需要這樣做。
如果服務器確實不返回JSON,而不是更改acceptableContentTypes
,則應僅使用AFHTTPSessionManager
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
或讓服務器返回JSON並確保它指定了正確的Content-Type
標頭:
<?php $json_str = file_get_contents('php://input'); $json = json_decode($json_str, true); header('Content-Type: application/json'); $result = array("received" => $json); echo json_encode($result); ?>
完成此操作后,我現在可以簡單地從客戶端代碼中完全刪除acceptableContentTypes
行,並繼續使用默認的AFJSONResponseSerializer
。
演示的構建parameters
機制不正確。 您正在創建一個其中僅包含一項的JSON字典,該字典本身就是JSON的字符串表示形式。
我建議您不要將實際的字典放入字典中,而不要在字典中放入字符串表示形式。 因此,如果您確實有JSON的NSData
,請將其轉換回嵌套的NSDictionary
/ NSArray
結構:
NSError *error; id jsonPayload = [NSJSONSerialization JSONObjectWithData:jsonPayloadData options:0 error:&error]; NSAssert(jsonPayload, @"json parsing error: %@", error); NSDictionary *parameters = @{@"project": jsonPayload};
現在,最有可能的是,使用dataWithJSONObject
創建NSData
,只是將其轉回並提取出來,這有點愚蠢,但是您只需要在parameters
使用原始的NSDictionary
,但是希望這可以說明這一點。
因此,將所有這些放在一起,假設您更改了服務器代碼以返回正確格式化的JSON響應,如上所述,客戶端代碼現在變為:
NSError *error;
id jsonPayload = [NSJSONSerialization JSONObjectWithData:jsonPayloadData options:0 error:&error];
NSAssert(jsonPayload, @"json parsing error: %@", error);
NSDictionary *parameters = @{@"project": jsonPayload};
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[manager POST:@"service.php" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@", [responseObject description]);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error=%@", error);
}];
如果這樣做,您將成功將JSON請求發送到服務器,它將被解析,插入到新的關聯數組中,轉換回JSON並返回到客戶端應用程序,后者將使用默認的AFJSONResponseSerializer
進行解析和記錄它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.