Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过POST发送JSON时出错_Ios_Json_Post - Fatal编程技术网

Ios 通过POST发送JSON时出错

Ios 通过POST发送JSON时出错,ios,json,post,Ios,Json,Post,我试图在帖子中发送JSON,但我得到一个错误:JSON文本没有以数组或对象开头,并且没有设置允许片段的选项 如果我通过Postman(一个用于测试请求的浏览器应用程序)发送此数据,它可以正常工作(返回数据) 只需尝试将您的params字符串和URLRequest更改为: NSString *params = @"devID=73899EAB-BB4F-4AE5-A691-8505E6AF0C3A&msisdn=+380503424248"; NSData *postData = [par

我试图在帖子中发送JSON,但我得到一个错误:JSON文本没有以数组或对象开头,并且没有设置允许片段的选项

如果我通过Postman(一个用于测试请求的浏览器应用程序)发送此数据,它可以正常工作(返回数据)


只需尝试将您的
params
字符串和
URLRequest
更改为:

NSString *params = @"devID=73899EAB-BB4F-4AE5-A691-8505E6AF0C3A&msisdn=+380503424248";
NSData *postData = [params dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setValue:postLenght forHTTPHeaderField:@"Content-Lenght"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPShouldHandleCookies:YES];
[request setHTTPBody:postData];

只需尝试将您的
params
字符串和
URLRequest
更改为:

NSString *params = @"devID=73899EAB-BB4F-4AE5-A691-8505E6AF0C3A&msisdn=+380503424248";
NSData *postData = [params dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setValue:postLenght forHTTPHeaderField:@"Content-Lenght"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPShouldHandleCookies:YES];
[request setHTTPBody:postData];

看起来您的JSON字符串无效。 在
\“msisdn\”
\“+380503424248\”
之间应该是一个

NSString*params = @"{\"devID\" : \"I:73899EAB-BB4F-4AE5-A691-8505E6AF0C3A\", \"msisdn\" : \"+380503424248\"}";

看起来您的JSON字符串无效。 在
\“msisdn\”
\“+380503424248\”
之间应该是一个

NSString*params = @"{\"devID\" : \"I:73899EAB-BB4F-4AE5-A691-8505E6AF0C3A\", \"msisdn\" : \"+380503424248\"}";

您可能需要检查您收到的响应中的
jsonData
,并确保它实际上是JSON。因此,正如Ashutosh所建议的,您应该检查
sendSynchronousRequest
中的
NSError
。此外,如果JSON解析失败,请检查
NSData
对象:

NSError *requestError;
NSURLResponse *response;
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];

// examine the HTTP status code (if any)

if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
    int statusCode = [(NSHTTPURLResponse *)response statusCode];
    if (statusCode != 200) {
        NSLog(@"%s: sendSynchronousRequest responded with statusCode = %d; expected 200", __PRETTY_FUNCTION__, statusCode);
    }
}

// examine the `requestError` (if any)

if (!jsonData) {
    NSLog(@"%s: sendSynchronousRequest error = %@", __PRETTY_FUNCTION__, requestError);
}

// now try to parse the response, reporting the JSON object if successful; reporting the `NSString` representation of the `jsonData` if not

NSError *parseError;
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&parseError];
if (results) {
    NSLog(@"%s: JSON parse succeeded; results = %@", __PRETTY_FUNCTION__, results);
} else {
    NSLog(@"%s: JSON parse failed; parseError = %@"; jsonData = %@", __PRETTY_FUNCTION__, parseError, [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
}
有了这样的东西,你就能准确地诊断出发生了什么


正如VaaChar所观察到的(+1),您对原始问题的JSON请求是无效的(尽管您随后已经修复了它)。上面的代码可以帮助您识别错误,因为您可以准确地看到服务器的响应

您可以使用
NSJSONSerialization
为您构建JSON,确保您拥有有效的JSON,而不是手动构建JSON,因为手动构建JSON容易出现此类简单错误。因此:

NSDictionary *params = @{@"devID"  : @"I:73899EAB-BB4F-4AE5-A691-8505E6AF0C3A",
                         @"msisdn" : @"+380503424248"};

NSError *jsonError;
NSData *body = [NSJSONSerialization dataWithJSONObject:params options:0 error:&jsonError];
if (!body) {
    NSLog(@"%s: dataWithJSONObject failed: %@", __PRETTY_FUNCTION__, jsonError);
} else {
    request.HTTPBody = body;
}

您可能需要检查您收到的响应中的
jsonData
,并确保它实际上是JSON。因此,正如Ashutosh所建议的,您应该检查
sendSynchronousRequest
中的
NSError
。此外,如果JSON解析失败,请检查
NSData
对象:

NSError *requestError;
NSURLResponse *response;
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];

// examine the HTTP status code (if any)

if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
    int statusCode = [(NSHTTPURLResponse *)response statusCode];
    if (statusCode != 200) {
        NSLog(@"%s: sendSynchronousRequest responded with statusCode = %d; expected 200", __PRETTY_FUNCTION__, statusCode);
    }
}

// examine the `requestError` (if any)

if (!jsonData) {
    NSLog(@"%s: sendSynchronousRequest error = %@", __PRETTY_FUNCTION__, requestError);
}

// now try to parse the response, reporting the JSON object if successful; reporting the `NSString` representation of the `jsonData` if not

NSError *parseError;
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&parseError];
if (results) {
    NSLog(@"%s: JSON parse succeeded; results = %@", __PRETTY_FUNCTION__, results);
} else {
    NSLog(@"%s: JSON parse failed; parseError = %@"; jsonData = %@", __PRETTY_FUNCTION__, parseError, [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
}
有了这样的东西,你就能准确地诊断出发生了什么


正如VaaChar所观察到的(+1),您对原始问题的JSON请求是无效的(尽管您随后已经修复了它)。上面的代码可以帮助您识别错误,因为您可以准确地看到服务器的响应

您可以使用
NSJSONSerialization
为您构建JSON,确保您拥有有效的JSON,而不是手动构建JSON,因为手动构建JSON容易出现此类简单错误。因此:

NSDictionary *params = @{@"devID"  : @"I:73899EAB-BB4F-4AE5-A691-8505E6AF0C3A",
                         @"msisdn" : @"+380503424248"};

NSError *jsonError;
NSData *body = [NSJSONSerialization dataWithJSONObject:params options:0 error:&jsonError];
if (!body) {
    NSLog(@"%s: dataWithJSONObject failed: %@", __PRETTY_FUNCTION__, jsonError);
} else {
    request.HTTPBody = body;
}
此代码正确运行:

NSDictionary *params = @{@"devID"  : [self getUUID],
                         @"msisdn" : [[NSUserDefaults standardUserDefaults] stringForKey:@"phone_number"]};

NSError *jsonError;
NSData *body = [NSJSONSerialization dataWithJSONObject:params options:0 error:&jsonError];

NSURL* url = [NSURL URLWithString:@"https://link.privatbank.ua/dms/gpsMobile/commonSMART/init?app=gpsMobile"];

request.URL = url;
request.HTTPMethod = @"POST";
[request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];  
request.HTTPBody = body;

NSURLResponse *response;
NSError *error;
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error] : nil;
此代码正确运行:

NSDictionary *params = @{@"devID"  : [self getUUID],
                         @"msisdn" : [[NSUserDefaults standardUserDefaults] stringForKey:@"phone_number"]};

NSError *jsonError;
NSData *body = [NSJSONSerialization dataWithJSONObject:params options:0 error:&jsonError];

NSURL* url = [NSURL URLWithString:@"https://link.privatbank.ua/dms/gpsMobile/commonSMART/init?app=gpsMobile"];

request.URL = url;
request.HTTPMethod = @"POST";
[request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];  
request.HTTPBody = body;

NSURLResponse *response;
NSError *error;
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error] : nil;

您在响应请求时是否收到此错误?顺便说一句,如果您发送JSON请求,约定建议您的请求指定它正在发送,例如,
[request setValue:@“application/JSON”forHTTPHeaderField:@“Content type”]。有时编写web服务代码是为了验证请求的内容类型是否符合预期。是的!我的代码中有很多错误,但在您的帮助下,我纠正了错误并得到了正确的请求。您是否在响应请求时收到了此错误?顺便说一句,如果您发送JSON请求,约定建议您的请求指定它正在这样做,例如,
[request setValue:@“application/JSON”forHTTPHeaderField:@“Content type”]。有时编写web服务代码是为了验证请求的内容类型是否符合预期。是的!我的代码中有很多错误,但在您的帮助下,我纠正了错误并得到了正确的请求。这是发送请求的另一种方式,但这显然假定服务器不需要JSON,正如他在问题中所建议的那样,而是
application/x-www-form-urlencoded
。这完全取决于他的服务器代码是如何配置的。这是发送请求的另一种方式,但这显然假定服务器不需要JSON,正如他在问题中所建议的那样,而是
application/x-www-form-urlencoded
。这完全取决于他的服务器代码是如何配置的。