2011-04-10 2 views
0

J'ai une application simulateur pour iPhone en tant que client et WCF-REST, service codé en json sur le serveur IIS 7.0. J'essaye d'envoyer des caractères hébraïques au service en tant que paramètre et le code d'erreur de retour du serveur 400 - Bad Request. Lorsque j'envoie une chaîne en anglais, le serveur traite la chaîne comme il se doit.Hébreu comme Gibberish du côté du serveur

Le code utilisé pour le codage de chaîne ressemble à ceci:

Notez que « paramètres » sont les paramètres sur le point d'être envoyés au serveur, comme parameter_name = commandés> parameter_value.

//RPC JSON 
NSString* reqString = [parameters JSONRepresentation]; 
//Request 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
NSData* requestData = [NSData dataWithBytes:[reqString UTF8String] length:[reqString length]]; 
//prepare http body 
[request setHTTPMethod: @"POST"]; 
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody: requestData]; 
urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 

La demande et la réponse que je reçois dans le côté serveur (obtenu ce en utilisant éthérée):

Demande:

POST /SmsliMobileService.svc/SetContactGroups HTTP/1.1 
Host: 192.168.10.22:8081 
User-Agent: Beeper_3/1.0 CFNetwork/485.12.7 Darwin/10.7.0 
Content-Length: 89 
Accept: application/json 
Content-Type: application/json; charset=UTF-8 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

Réponse:

{"ApplicationID":"98534bb6-82ef-4937-83e7-10f65780bf36","contact_id":43,"groups":"עבו×HTTP/1.1 400 Bad Request 
Content-Length: 1647 
Content-Type: text/html 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Sun, 10 Apr 2011 07:46:09 GMT 

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Request Error</title> 
    <style>BODY { color: #000000; background-color: white; font-family: Verdana; margin- left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding- bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; }  A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active {  color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background- color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font- size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding- left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding:  5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre- wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse;  border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid;  border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td {  border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;} </style> 
    </head> 
    <body> 
    <div id="content"> 
     <p class="heading1">Request Error</p> 
     <p>The server encountered an error processing the request. See server logs for  more details.</p> 
    </div> 
    </body> 
</html> 

Tous l'aide sera appréciée.

+0

Cela ressemble à un problème côté serveur pour moi. Cette erreur peut être provoquée par une exception dans votre programme serveur. Activez le mode débogage sur le serveur afin que vous puissiez voir l'exception complète dans la réponse, ou regardez les journaux, pour voir quelle est l'erreur. –

+0

J'ai posté la demande brute et la réponse. N'est-ce pas le meilleur débogage que nous pouvons obtenir? – ofirbt

Répondre

0

J'ai eu une erreur sur le code affiché.

NSData* requestData = [NSData dataWithBytes:[reqString UTF8String] length:[reqString length]]; 

Cette ligne (était à l'origine dans le code de la question) a généré l'erreur - au lieu de prendre la longueur du tableau octets renvoyés de: « [reqString UTF8String] », une mauvaise longueur avait été donnée - la longueur le NSString ...

le code fixe:

const char *utf8String = [reqString UTF8String]; // no need to free me - autoreleased object returned. 
NSInteger l = strlen(utf8String); 
NSData *requestData = [NSData dataWithBytes:utf8String length:l]; 
Questions connexes