will targetsdkversion spec plugin name from found engine define changes iphone objective-c django ios django-views

iphone - targetsdkversion - plugin xml cordova



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

Como controlas ambos lados, eliminaría la complejidad de xml al codificar los datos y usar RestKit u otro marco que facilite la comunicación con Django.

Estoy intentando implementar una tabla de clasificación en línea en una aplicación de juegos para iOS, usando Django para procesar las solicitudes POST desde iDevice y almacenar las puntuaciones. He descubierto cómo hacer que Django serialice los objetos en XML, y mi iPhone puede leer y mostrar los puntajes. Sin embargo, no puedo por mi vida que mi iPhone envíe POST XML a mi servidor Django.

A continuación se muestra la función que estoy usando 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 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]; } }

El método anterior tiene éxito al enviar la solicitud, y la interpreta correctamente como CONTENT_TYPE: text/xml , pero la vista de Django que procesa la solicitud no parece tener sentido de ella, interpretándola casi como si fuera simplemente texto sin formato. A continuación está mi vista de Django ...

Vista 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 sincero, no estoy seguro de si el problema radica en el Objective-C o en el código de Django. ¿Objective-C no envía el XML en el formato correcto? ¿O el servidor de Django no está procesando ese XML correctamente?

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

Actualizar:

Lo hice funcionar, editando el Controlador de iOS para configurar el cuerpo HTTP de la solicitud como sigue:

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, poner un punto y coma hizo que Django lo reconociera, asignara los valores a una nueva instancia de una clase HighScore y lo guardara. El registro en el servidor de prueba 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 , eché un vistazo a highScoreData con NSLog, justo después de anexarlo a request.HTTPBody, y el resultado es <706c6179 65725f6e 616d653d 74657374 3b73636f 72653d39> .

Soy un gran novato Obj-C, así que, de nuevo, ¡cualquier ayuda es apreciada! Gracias de nuevo.