发布方法 nsdictionary 到 json 对象 iOS 目标 c.



我正在尝试将字典数组发送到服务器,在此之前我正在转换为json格式

注意:- 服务器运行良好,我在Android中的朋友正在获得成功开机自检方法的响应和数据

以下是我的发布方法代码:-

NSError *error;
NSMutableDictionary *tvarns = [[NSMutableDictionary alloc] init];
tvarns[@"order_cart"]=_order_cart;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:tvarns
options:NSJSONWritingPrettyPrinted error:&error];
NSLog(@"%@",jsonData);
NSString* order_cart;
order_cart = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@",order_cart);
NSString *post = [NSString stringWithFormat:@"%@",order_cart];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
//  Next up, we read the postData's length, so we can pass it along in the request.
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
// Now that we have what we'd like to post, we can create an NSMutableURLRequest, and include our postData
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://test.kre8tives.com/barebon/add_cartapi.php"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
NSLog(@"the data Details is %@", post);
//   And finally, we can send our request, and read the reply by creating a new NSURLSession:
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; // this is json string
NSLog(@"Reply = %@", requestReply);
//   NSError *error;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; // you need to convert to dictionary object
NSLog(@"requestReply: %@", jsonDict);
}] resume];
[self presentViewController:alertController animated:YES completion:nil];
}

服务器想要的值是

{"order_cart":[{"customer_id":"114","item_id":14,"_id":"591d3822f55e2270202d8ff1","item_name":"Bira White","item_quantity":"2","price":"180.0","qr_code":"table21","phone":"7008841769","customer_name":"Samanthaa"},{"customer_id":"114","item_id":15,"_id":"591d3822f55e2270202d8ff0","item_name":"Bira Blonde","item_quantity":"2","price":"200.0","qr_code":"table21","phone":"7008841769","customer_name":"Samanthaa"}]}

我的 nslog 是

2017-06-28 16:16:41.334 Barebones[3139:211622] the data Details is {
"order_cart" : [
{
"phone" : "9047038606",
"item_quantity" : "7",
"qr_code" : "table21",
"item_name" : "Bottled Water",
"price" : "175",
"customer_id" : "116",
"customer_name" : "Akshay"
},
{
"phone" : "9047038606",
"item_quantity" : "2",
"qr_code" : "table21",
"item_name" : "Fresh Lime Soda(Sweet, Salt, Plain)",
"price" : "158",
"customer_id" : "116",
"customer_name" : "Akshay"
},
{
"phone" : "9047038606",
"item_quantity" : "2",
"qr_code" : "table21",
"item_name" : "Bottled Water",
"price" : "50",
"customer_id" : "116",
"customer_name" : "Akshay"
},
{
"phone" : "9047038606",
"item_quantity" : "2",
"_id" : "591d3822f55e2270202d8ff0",
"item_name" : "Bira Blonde",
"price" : "86",
"qr_code" : "table21",
"customer_id" : "116",
"item_id" : "3971",
"customer_name" : "Akshay"
},
{
"phone" : "9047038606",
"item_quantity" : "1",
"qr_code" : "table21",
"item_name" : "Bottled Water",
"price" : "25",
"customer_id" : "116",
"customer_name" : "Akshay"
}
]
}
2017-06-28 16:16:41.485 Barebones[3139:211669] Reply =   {"order_id":3961,"success":1}
<script type='text/javascript'    src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js'>.      </script>
<script>
var data_array='{"source":{"name":"Kre8Tives","id":"SJQ6kyA1","order_id":"3961"},"customer":{"firstname":"","mobile":""},"tabType":"table","tabId":"591d3790498782970be66302","tableNumber":"1","items":null}';
alert(data_array);
var settings = {
'async': true,
'crossDomain': true,
'url': 'http://posistapi.com/api/v1/table_order/push?customer_key=8c982f5e9ef091e9d5c8fb142311b49a68049b102de5e0987ebce29755c454227fbc7573c7da4199f126524a3ac7a39a&tabtype=table',
'method': 'POST',
'headers': {
'postman-token': 'e200ae19-d083-a98a-6db3-53fc2f8bd73f',
'cache-control': 'no-cache',
'authorization': 'Basic [removed]',
'content-type': 'application/json'
},
'processData': false,
'data': data_array,
'acceptUrl':'http://test.kre8tives.com/barebon/order_confirm.php',
'rejectUrl':'http://test.kre8tives.com/barebon/order_confirm.php',
'billPrintUrl':'http://test.kre8tives.com/barebon/order_confirm.php'
}
$.ajax(settings).done(function (response) {
console.log(response);
});
</script>
2017-06-28 16:16:41.486 Barebones[3139:211669] requestReply: (null)

我已经转换为所需的儿子格式,但仍然没有得到服务器的回复

即使我发送的数据返回我从服务器发送的数据,我也得到空!!为什么???提前感谢:)!!

这是我的PHP代码

<?php
include('order-function.php');
if($_SERVER["REQUEST_METHOD"] == "POST") 
{
$order_cart=$_POST['order_cart'];
$items=json_decode($order_cart,true);
include('dbconfig.php');
$response = array();
try
{
$total_item_price=0;
foreach ($items['order_cart'] as $item) {   //['order_cart']
$customer_id=$item['customer_id'];
$customer_name=$item['customer_name'];
$phone=$item['phone'];
$_id=$item['_id'];
$item_name=$item['item_name'];
$item_quantity=$item['item_quantity'];
$price=$item['price'];
$qr_code=$item['qr_code'];
$products[]=array(
"_id"=>"$_id",
"item_name"=> $item_name,
"item_price"=> $price,
"item_quantity"=> $item_quantity
);          
$price_new+=$price;

$item_push[]=array(
"id"=>"$_id",
"rate"=> $price,
"quantity"=> $item_quantity
);
}

$product_details=json_encode($products);
$add_to_cart = "INSERT INTO order_cart (customer_id,product_details,order_amount,qr_code) VALUES ('$customer_id','$product_details','$price_new','$qr_code')";
$result = mysqli_query($conn,$add_to_cart);
$order_id=mysqli_insert_id($conn);
if ($result) {
$data['source']=array("name"=>"Kre8Tives",
"id"=>"SJQ6kyA1",
"order_id"=>"$order_id"
);
$data['customer']=array(
"firstname"=>"$customer_name",
"mobile"=>"$phone"
);
$data['tabType']= "table";
$data['tabId']= "591d3790498782970be66302";
$data['tableNumber']= "1";
//items
$data_one=json_encode($item_push,JSON_NUMERIC_CHECK);
$data_new=json_decode($data_one);
$data['items']=$data_new;
$data_item=json_encode($data);

$response["order_id"] = $order_id;
$response["success"] = 1;
// print_r(json_encode($data));die;

} else {
$response["success"] = 0;
}



echo json_encode($response);
push_order($data_item);
}
catch(Exception $e)
{
$response["success"] = 0;
$response["message"] = "error occured";
}
}
?>

坦率地说,查看您的NSLog结果,看起来服务器代码在 JSON 结果后错误地返回了一些额外的 HTML(从<script>行开始)。查看$response的正文,它报告成功,但看起来响应中包含一些额外的文本,要么是push_order的结果,要么是%>之后的一些 HTML,要么是插入一些额外 HTML 的 Web 服务错误。

专注于客户端请求代码,它应该设置Content-TypeAccept标头,尽管这并不重要。但是设计良好的请求应该做到这一点。关键问题是 PHP 应该在输出 JSON 之前或之后不输出任何其他内容。

值得一提的是,如果您的 Web 服务期望真正的 JSON 请求,我会建议对您的客户端代码进行一系列简化(除了设置这两个额外的标头)。例如,只需将NSJSONSerialization的输出作为httpBody发送即可;不要拿那个NSData,把它转换成NSString,然后再转换成NSData。只需将jsonData作为httpBody发送:

NSDictionary *tvarns = @{@"order_cart": _order_cart};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:tvarns
options:0
error:&error];
// if you want to see the JSON, you can do this, but this is not needed
//
// NSString *order_cart = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
// NSLog(@"%@",order_cart);
// none of this stuff is needed; at worst, it can introduce encoding problems; at best, it's inefficient to do all that stuff
//
// NSString *post = [NSString stringWithFormat:@"%@",order_cart];
// NSLog(@"the data Details is %@", post);
// NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
// //  Next up, we read the postData's length, so we can pass it along in the request.
// NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
// Now that we have what we'd like to post, we can create an NSMutableURLRequest, and include our jsonData
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://test.kre8tives.com/barebon/add_cartapi.php"]];
[request setHTTPMethod:@"POST"];
// you don't need this, because NSURLSession sets the length for you
//
// [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
// use the original jsonData here
[request setHTTPBody:jsonData];
// you should, if you're a good web-service citizen, set the header; it's not always needed, but it's advisable
// tell the server that you're sending JSON request
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// tell the server that you're expecting JSON response
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
// Unless you need a new session for some reason, it's better to use the shared session
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"error: %@", error);
}
if (!data) {
return;
}
NSError *parseError;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError]; // you need to convert to dictionary object
if (jsonDict) {
NSLog(@"requestReply: %@", jsonDict);
} else {
NSLog(@"parseError: %@", parseError);
NSLog(@"response: %@", response); // when you have failure, it's sometimes useful to see what this says
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // this is json string
NSLog(@"requestReply: %@", requestReply);
}
}] resume];

同样,在建议进行这些简化之后,我真的怀疑服务器代码中存在错误,包括<script>...后的所有垃圾。我敢打赌,您的Android代码在响应结束时忽略了所有这些错误数据,而NSJSONSerialization正确地指出,从技术上讲,响应不是格式良好的JSON。(顺便说一下,我上面的代码将正确记录 JSON 错误。


查看您添加到修改后的问题中的PHP代码,它正在抓取$order_cart=$_POST['order_cart'];,这意味着您的Web服务需要x-www-form-urlencoded请求。然后,PHP 代码继续将$items定义为json_decode($order_cart,true),然后通过$items['order_cart']foreach进行迭代。这意味着 Web 服务期待x-www-form-urlencoded请求,其与order_cart键关联的值本身就是由order_cart(再次)键控的 JSON 字典,即请求正文看起来像order_cart={"order_cart":[...]}

这不是一个非常优雅的设计,但如果你坚持下去,你将不得不创建x-www-form-urlencoded请求,其键是order_cart的,其值是{"content-type":[...]}形式的 JSON 字典的百分比编码表示。

NSDictionary *tvarns = @{@"order_cart": _order_cart};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:tvarns
options:0
error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *bodyString = [NSString stringWithFormat:@"order_cart=%@", [jsonString stringByAddingPercentEncodingQueryValue]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://test.kre8tives.com/barebon/add_cartapi.php"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
// Unless you need a new session for some reason, it's better to use the shared session
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"error: %@", error);
}
if (!data) {
return;
}
NSError *parseError;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError]; // you need to convert to dictionary object
if (jsonDict) {
NSLog(@"requestReply: %@", jsonDict);
} else {
NSLog(@"parseError: %@", parseError);
NSLog(@"response: %@", response); // when you have failure, it's sometimes useful to see what this says
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // this is json string
NSLog(@"requestReply: %@", requestReply);
}
}] resume];

哪里:

@interface NSCharacterSet (URLQueryValue)
/**
Character set of characters allowed within value (or a key) in a application/x-www-form-urlencode key/value pair.
@return NSCharacterSet of allowed characters.
*/
+ (NSCharacterSet *) URLQueryValueAllowedCharacterSet;
@end
@implementation NSCharacterSet (URLQueryValue)
+ (NSCharacterSet *) URLQueryValueAllowedCharacterSet {
static NSString * const generalDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4
static NSString * const subDelimitersToEncode = @"!$&'()*+,;=";
NSString * const characterToEncode = [generalDelimitersToEncode stringByAppendingString:subDelimitersToEncode];
NSMutableCharacterSet *cs = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[cs removeCharactersInString:characterToEncode];
return cs;
}
@end

@interface NSString (URLQueryValue)
/**
String percent encoding for key or value in key/value pair within an application/x-www-form-urlencoded request.
@return Percent encoded string.
*/
- (NSString *)stringByAddingPercentEncodingQueryValue;
@end
@implementation NSString (URLQueryValue)
- (NSString *)stringByAddingPercentEncodingQueryValue {
return [self stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
}
@end

坦率地说,我建议更改Web服务以处理真正的JSON请求,而不是x-www-form-urlencoded请求中的JSON。如果你这样做,客户端代码看起来会更像我上面的原始答案。但是对于现有的 Web 服务代码,您将创建类似于我的第二个代码示例的内容。

NSDictionary *dict = @{@"order_cart": _order_cart};
NSLog(@"dict = %@", dict);
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
// For debug
NSString *postString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"postString = %@", postString);
//
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[jsonData length]];
NSURL *url = [NSURL URLWithString:@"http://test.kre8tives.com/barebon/add_cartapi.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error) {
id jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSLog(@"jsonDict = %@", jsonDict);
if (!error) {
}
else {
}
}
else {
}
}];
[task resume];

尝试以下代码

NSMutableDictionary *parametersDictionary = [[NSMutableDictionary alloc]init];
[parametersDictionary setValue:@"114" forKey:@"customer_id"];
[parametersDictionary setValue:@"14" forKey:@"item_id"];
[parametersDictionary setValue:@"591d3822f55e2270202d8ff1" forKey:@"_id"];
[parametersDictionary setValue:@"Bira White" forKey:@"item_name"];
[parametersDictionary setValue:@"2" forKey:@"item_quantity"];
[parametersDictionary setValue:@"180.0" forKey:@"price"];
[parametersDictionary setValue:@"table21" forKey:@"qr_code"];
[parametersDictionary setValue:@"7008841769" forKey:@"phone"];
[parametersDictionary setValue:@"Samanthaa" forKey:@"customer_name"];
NSMutableDictionary *requestParametersDic=[[NSMutableDictionary alloc] initWithObjectsAndKeys:parametersDictionary,@"order_cart", nil];
NSData * postData=[NSJSONSerialization dataWithJSONObject:requestParametersDic options:NSJSONWritingPrettyPrinted error:nil];

NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",KWebservicesBaseURL,kiPestConfirmOrder]]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSString *responseString=[[NSString alloc]init];
if(data!=nil && httpResponse.statusCode==200)
{
responseString=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// NSLog(@"i deliver add order reponse str %@",responseString);
}
else
{
}
}];
[postDataTask resume];

你必须直接将NSData传递给HttpBody,如下所示:

NSDictionary *headers = @{ @"content-type": @"application/json",
@"cache-control": @"no-cache"
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:tvarns
options:NSJSONWritingPrettyPrinted error:&error];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://test.kre8tives.com/barebon/add_cartapi.php"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:postData];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(@"%@", httpResponse);
}
}];
[dataTask resume];

希望这将有助于您的数据请求成功!

你的数组是正确的,只需转换为 json 字符串即可

这是函数

public func jsonString(prettify: Bool = false) -> String? {
guard JSONSerialization.isValidJSONObject(self) else {
return nil
}

以这种方式使用它

self.arrOrderCart.jsonString()

最新更新