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.