Ios 通过POST发送JSON时出错
我试图在帖子中发送JSON,但我得到一个错误:JSON文本没有以数组或对象开头,并且没有设置允许片段的选项 如果我通过Postman(一个用于测试请求的浏览器应用程序)发送此数据,它可以正常工作(返回数据)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
只需尝试将您的
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
。这完全取决于他的服务器代码是如何配置的。