¿Cómo envío datos XML POST desde una aplicación iOS a una aplicación Django?

Estoy intentando implementar una tabla de sorting en línea en una aplicación de juego para iOS, usando Django para procesar las requestes POST del iDevice y almacenar los puntajes. He descubierto cómo lograr que Django serialice los objects en XML, y mi iPhone puede leer y mostrar los puntajes. Sin embargo, no puedo por toda mi vida tener mi iPhone POST XML en mi server Django.

A continuación se muestra la function que utilizo para publicar los puntajes …

Controlador iOS (Objective-C):

- (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 shanetworkingApplication] setNetworkActivityIndicatorVisible: YES]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest: request delegate: self]; if (!connection) { NSLog(@"Request to send high scores appears to be invalid."); [[UIApplication shanetworkingApplication] setNetworkActivityIndicatorVisible: NO]; } } 

El método anterior logra enviar la request y la interpreta correctamente como CONTENT_TYPE: text/xml , pero la vista de Django que procesa la request no parece tener sentido, interpretándola casi como si fuera simplemente text sin formatting. A continuación se muestra mi vista de Django …

Opinión de Django (Python):

 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 ) ) 

Para ser honesto, no estoy seguro de si el problema está en el código Objective-C o Django. ¿El Objective-C no envía el XML en el formatting correcto? ¿O el server Django no está procesando correctamente ese XML?

Cualquier idea sería muy apreciada. Gracias por adelantado.

Actualizar:

Lo puse a funcionar, editando el Controlador iOS para configurar el HTTPBody de la request de la siguiente manera:

 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]; 

Por alguna razón, al poner un punto y coma ahí, Django lo reconoció, asignó los valores a una nueva instancia de una class HighScore y lo guardó. El logging en el server de testing indica request.POST es <QueryDict: {u'score': [u'9'], u'player_name': [u'test']}> .

Todavía no estoy seguro de qué hacer con todo esto.

Según la sugerencia de Radu , analicé highScoreData con NSLog, justo después de anexarlo a request.HTTPBody, y el resultado es <706c6179 65725f6e 616d653d 74657374 3b73636f 72653d39> .

Soy un gran Obob-C noob, así que de nuevo, ¡se agradece cualquier ayuda! Gracias de nuevo.

Dado que controlas ambos lados, solté la complejidad de xml que codifica los datos y uso RestKit o algún otro marco que facilita la comunicación con Django.