我已经用尽了其他线程,所以我在这里发布这个问题。请原谅我一路上犯的任何新手错误。我一直在阅读很多,我觉得我很困惑。从ASIHTTPRequest传递JSON到django
目标: 我试图将数据从objective-c中的表单传递到我的django web服务。为了协助解决这个问题,我采用了ASIHTTPRequest
类来促进信息传递。一旦发送到Web服务,我想将这些数据保存到我的sqlite3数据库。
步骤: 在目标C端: 我已经存储在所述输入表格数据,并在一个NSDictionary它们各自的密钥,这样的:
NSDictionary *personInfo = [NSDictionary dictionaryWithObjectsAndKeys:firstName.text, @"fName", middleName.text, @"mName", lastName.text, @"lName", nil];
我已经在它添加到我的ASIHTTPRequest通过使用委托来创建一个不同的类。我做了的NSDictionary上面一样在下面为简单起见,像这样的代码块:
NSString *jsonPerson = [personInfo JSONRepresentation];
[request addRequestHeader: @"Content-Type" value:@"application/json; charset=utf-8"];
[request appendPostData:[jsonPerson dataUsingEncoding:NSUTF8StringEncoding]];
[request setRequestMethod:@"POST"];
[request startAsynchronous];
而一个NSLog的显示我传递到像这样的字符串,它在JSONLint
至少验证{"mName":"Arthur","lName":"Smith","fName":"Bob"}
因为我看到的似乎是有效的JSON从我ASIHTTPRequest来了,动作从requestfinished运行:而不是requestfailed:,我正在做的假设,这个问题更可能是不Objective-C方面,而是在Django方面。
这里是我试过到目前为止:
json.loads(request.POST)
>>expected string or buffer
json.loads('request.POST')
>>no JSON object to decode
json.loads(request.raw_post_data)
>>mNamelNamefName
incoming = request.POST
>>{"mName":"Arthur","lName":"Smith","fName":"Bob"}
incoming = request.POST
onlyValues = incoming.iterlists()
>>(u'{"mName":"Arthur","lName":"Smith","fName":"Bob"}', [u''])
...等看似牵强的变化略知一二。我保存了一个日志,并可以详细说明。我能找到的唯一希望就是最后一个例子。它看起来像是将整个字符串视为关键字,而不是按照我的预期分解每个字典对象和关键字。
我意识到这是非常基本的,我通常不会问,但这个问题让我特别难过。我还记得在python不会识别每个对象和关键字的双引号的地方,为了得到django喜欢的东西,每个都应该被单引号包围。我只是不知道如何让他们这样。
谢谢!
你的代码是正确的 - 你的json字符串的NSLog会在对象和键上产生单引号。我仍然认为问题在于Django方面,以及我如何解析这些数据。不过谢谢你的回应。 – m4rk 2011-05-17 14:58:40
好的,你也可以查看serser-side django的确切响应。如果它被“”包围,那么这可能是django不会将其视为JSON的原因。 – 2011-05-18 09:41:20
我不知道python,所以我可能完全错了,但从我看到服务器端的POST响应是一个unicode字符串数组(两次u''),所以你可能想使用[request setPostValue :[jsonPerson dataUsingEncoding:NSUTF8StringEncoding] forKey:@“person”];而不是appendPostData来消除数组问题。然后使用post数组中的'person'字段。 – 2011-05-18 09:50:28