Iphone 如何从iOS应用程序向Django应用程序发送XML POST数据?
我正在尝试在iOS游戏应用程序中实现在线排行榜,使用Django处理来自iDevice的POST请求并存储分数。我已经知道如何让Django将对象序列化为XML,我的iPhone可以读取和显示分数。然而,我无法让我的iPhone将XML发布到Django服务器 下面是我用来发布分数的函数 iOS(Objective-C)控制器: 老实说,我不确定问题是出在Objective-C还是Django代码中。Objective-C是否以正确的格式发送XML?还是Django服务器没有正确处理该XML 如有任何见解,将不胜感激。提前谢谢 更新: 我通过编辑iOS控制器将请求的HTTPBody设置为:Iphone 如何从iOS应用程序向Django应用程序发送XML POST数据?,iphone,objective-c,django,ios,django-views,Iphone,Objective C,Django,Ios,Django Views,我正在尝试在iOS游戏应用程序中实现在线排行榜,使用Django处理来自iDevice的POST请求并存储分数。我已经知道如何让Django将对象序列化为XML,我的iPhone可以读取和显示分数。然而,我无法让我的iPhone将XML发布到Django服务器 下面是我用来发布分数的函数 iOS(Objective-C)控制器: 老实说,我不确定问题是出在Objective-C还是Django代码中。Objective-C是否以正确的格式发送XML?还是Django服务器没有正确处理该XML 如
NSMutableData *highScoreData = [NSMutableData data];
[highScoreData appendData: [[NSString stringWithFormat: @"player_name=%@;", @"test"] dataUsingEncoding: NSUTF8StringEncoding]];
[highScoreData appendData: [[NSString stringWithFormat: @"score=%d", 0] dataUsingEncoding: NSUTF8StringEncoding]];
[request setHTTPBody: highScoreData];
出于某种原因,在其中添加分号可以让Django识别它,将值分配给HighScore类的新实例,然后保存它。测试服务器上的日志记录表明请求。POST
是
我仍然不太确定如何处理这一切
根据建议,在将highScoreData添加到request.HTTPBody之后,我使用NSLog查看了highScoreData,结果是
我是一个巨大的Obj-C noob,所以再次感谢您的帮助!再次感谢。由于您可以控制双方,因此我会降低xml编码数据的复杂性,并使用RestKit或其他一些框架,以便与Django轻松通信。将xml存储在字符串中,然后使用NSLog查看它,对发送和接收的xml执行此操作。这样,你就知道问题出在哪里了。谢谢你的建议!我尝试了
NSLog(@“%@”,highScoreData)
并在上面发布了结果。问题在于格式,结果是十六进制的。很高兴你让它工作了。快乐编码
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.core import serializers
from django.core.exceptions import ValidationError
from django.views.decorators.csrf import csrf_exempt
from modologger.taptap.models import HighScore
@csrf_exempt
def leaderboard( request, xml = False, template_name = 'apps/taptap/leaderboard.html' ):
"""Returns leaderboard."""
if xml == True: # xml is set as True or False in the URLConf, based on the URL requested
if request.method == 'POST':
postdata = request.POST.copy()
print postdata
# here, postdata is evaluated as:
# <QueryDict: {u'<?xml version': [u'"1.0" encoding="UTF-8" ?><player_name>test</player_name<score>0</score></xml>']}>
for deserialized_object in serializers.deserialize('xml', postdata): # this fails, returning a 500 error
try:
deserialized_object.object.full_clean()
except ValidationError, e:
return HttpResponseBadRequest
deserialized_object.save()
else:
high_score_data = serializers.serialize( 'xml', HighScore.objects.all() )
return HttpResponse( high_score_data, mimetype = 'text/xml' )
else:
high_scores = HighScore.objects.all()
return render_to_response( template_name, locals(), context_instance = RequestContext( request ) )
NSMutableData *highScoreData = [NSMutableData data];
[highScoreData appendData: [[NSString stringWithFormat: @"player_name=%@;", @"test"] dataUsingEncoding: NSUTF8StringEncoding]];
[highScoreData appendData: [[NSString stringWithFormat: @"score=%d", 0] dataUsingEncoding: NSUTF8StringEncoding]];
[request setHTTPBody: highScoreData];