Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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 是否有一个';技巧';用于在NSURLSession连接中发送原始NSString而不是NSData?_Ios_Objective C_Json_Nsdata_Nsurlsession - Fatal编程技术网

Ios 是否有一个';技巧';用于在NSURLSession连接中发送原始NSString而不是NSData?

Ios 是否有一个';技巧';用于在NSURLSession连接中发送原始NSString而不是NSData?,ios,objective-c,json,nsdata,nsurlsession,Ios,Objective C,Json,Nsdata,Nsurlsession,我正在尝试使用NSURLSession与后端通信,但是,后端未设置为正确读取NSData,因此它将我发送的NSData登录详细信息视为false,我想知道是否可以让NSURLSession发送原始字符串而不是NSData对象。我查阅过书籍和网络,几个星期来一直被难倒 重做后端不是一个选项,负责该选项的工程师离开了。欢迎任何帮助 谢谢。以下是我到目前为止所做的工作,以防有人需要查看一些代码 NSError *error; NSURLSessionConfiguration *sessionCon

我正在尝试使用NSURLSession与后端通信,但是,后端未设置为正确读取NSData,因此它将我发送的NSData登录详细信息视为false,我想知道是否可以让NSURLSession发送原始字符串而不是NSData对象。我查阅过书籍和网络,几个星期来一直被难倒

重做后端不是一个选项,负责该选项的工程师离开了。欢迎任何帮助

谢谢。以下是我到目前为止所做的工作,以防有人需要查看一些代码

NSError *error;

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration ];

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];

NSString *rawUrlString = @"backend_url";

NSURL *url = [NSURL URLWithString:rawUrlString];

NSLog(@"%@", url);


NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:
                            login data here

                            nil];

//NSLog(@"%@", parameters);

NSData *rawJson = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&error];

NSString *myString = [[NSString alloc] initWithData:rawJson encoding:NSUTF8StringEncoding];

NSData *finalData = [myString dataUsingEncoding:NSUTF8StringEncoding];


NSMutableData *body = [NSMutableData data];

[body appendData:finalData];

[request setHTTPMethod:@"POST"];
[request setHTTPBody:body];

[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"charset"];
[request setValue:@"XMLHttpRequest" forHTTPHeaderField:@"X-Requested-With"];

NSURLSessionDataTask *postTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
     NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]);

}];

[postTask resume];
`

更新:我已经清理了不必要的部分,这是最终的代码(尽管仍然不起作用)


您的后端已设置为处理
NSData
。通过internet连接发送字符串是不可能的,您只能发送
NSData
,所有服务器都需要它

这里的代码是错误的:

NSData *rawJson = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&error];

NSString *myString = [[NSString alloc] initWithData:rawJson encoding:NSUTF8StringEncoding];

NSData *finalData = [myString dataUsingEncoding:NSUTF8StringEncoding];
相反,只需这样做:

NSData *finalData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&error];

NSData
对象将包含一个格式正确的字符串,以便服务器也能识别为字符串。请注意,它将采用UTF-8编码,可能在某些服务器上您希望将其更改为其他编码。

在最低级别,您只需向服务器发送字节。NSData和NSString等对象只是更高级别的抽象。您从服务器得到了什么响应?将字符集标题设置为“application/json”在我看来是错误的,因为这是一种mime类型,而不是一个字符集。我收到一个错误,告诉我用户名和密码字段是必需的。您提供的参数是json,但标题说您打算发送
x-www-form-urlencoded
。是哪一个?如果是JSON,您的
内容类型应该更改。如果不是JSON,那么您的
HTTPBody
应该会更改。brilliant Rob,我来试一试。Thanks@JoshuaAreogun请求看起来基本正确,因此问题可能是服务器代码和客户端代码不同步。您没有分享
登录
的构造方式,也没有分享服务器正在寻找的内容。但问题无疑在于两者之间的脱节。你说的“没有运气”是什么意思?哪一行代码没有按应有的方式工作?我所有的代码都可以工作。正如我在问题的开始部分提到的,我需要知道是否有一个解决方法来发送原始字符串,因为服务器端代码似乎有问题,我无法访问它。服务器仍然无法解码NSDatainfo@JoshuaAreogunNSData不需要解码,它没有任何类型的编码。问题不在于NSData,而在于你做错了什么。你能提供运行服务器的人的详细信息吗?你应该如何使用它?或者其他语言的参考代码?
NSData *finalData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&error];