首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将XML POST数据从iOS应用程序发送到Django应用程序?

如何将XML POST数据从iOS应用程序发送到Django应用程序?
EN

Stack Overflow用户
提问于 2011-05-08 15:14:43
回答 1查看 7.2K关注 0票数 4

我正在尝试在iOS的游戏应用中实现一个在线排行榜,使用Django处理来自iDevice的POST请求并存储分数。我已经知道了如何让Django将对象序列化为XML,并且我的iPhone可以读取和显示分数。然而,我无论如何也不能让我的iPhone将XML发布到我的Django服务器上。

下面是我用来发布分数的函数。

iOS (Objective-C)控制器:

代码语言:javascript
复制
- (void) submitHighScore {
    NSLog(@"Submitting high score...");

    NSString *urlString = HIGH_SCORES_URL;
    NSURL *url = [NSURL URLWithString: urlString];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url];
    [request setHTTPMethod: @"POST"];
    [request setValue: @"text/xml" forHTTPHeaderField: @"Content-Type"];

    NSMutableData *highScoreData = [NSMutableData data];
    [highScoreData appendData: [[NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"] dataUsingEncoding: NSUTF8StringEncoding]];
    [highScoreData appendData: [[NSString stringWithFormat: @"<player_name>%@</player_name", @"test"] dataUsingEncoding: NSUTF8StringEncoding]];
    [highScoreData appendData: [[NSString stringWithFormat: @"<score>%d</score>", 0] dataUsingEncoding: NSUTF8StringEncoding]];
    [highScoreData appendData: [[NSString stringWithFormat: @"</xml>"] dataUsingEncoding: NSUTF8StringEncoding]];
    [request setHTTPBody: highScoreData];

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: YES];

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest: request 
                                                                  delegate: self];
    if (!connection) {
        NSLog(@"Request to send high scores appears to be invalid.");
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: NO];
    }
}

上面的方法成功地发送了请求,并将其正确地解释为CONTENT_TYPE: text/xml,但是处理该请求的Django视图似乎无法理解它,几乎将其解释为仅仅是纯文本。下面是我的Django视图...

Django (Python)视图:

代码语言:javascript
复制
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 ) )

老实说,我不确定问题出在Objective-C还是Django代码中。Objective-C没有以正确的格式发送XML吗?或者是Django服务器没有正确处理该XML?

任何洞察力都将不胜感激。提前谢谢。

更新:

我让它工作,通过编辑iOS控制器来设置请求的HTTPBody,如下所示:

代码语言:javascript
复制
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类的新实例,然后保存它。测试服务器上的日志显示request.POST<QueryDict: {u'score': [u'9'], u'player_name': [u'test']}>

我还是不太确定这一切是怎么回事。

根据Radu's的建议,在将highScoreData添加到request.HTTPBody之后,我使用NSLog查看了它,结果是<706c6179 65725f6e 616d653d 74657374 3b73636f 72653d39>

我是一个巨大的Obj-C菜鸟,所以再次,任何帮助都是感激的!再次感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-12 08:18:11

由于您可以同时控制两端,因此我将放弃对数据进行xml编码的复杂性,而使用RestKit或其他一些框架来简化与Django的通信。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5926140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档