2015-10-09 11 views
9

Ich verwende AFNetworking 2.0.AFNetworking serialisiert Schrägstrich, wodurch die JSON-Nutzlast ungültig wird

In AFNetworking, AFHTTPRequestOperationManager Objekt hat eine API:

(AFHTTPRequestOperation *)POST:(NSString *)URLString 
        parameters:(id)parameters 
         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure 

Er akzeptiert NSDictionary als params für die JSON Payload, die wir zu 'POST' an den Server möchten. In meiner Nutzlast haben folgende I Schlüssel-Wert-Paar:

"buttonActionParam":"/catalog/special/international-calling"

der Veröffentlichung dieser Nutzlast-Server ungültig JSON zurückgibt. Mit Blick auf die Nutzlast auf der Serverseite erkannte ich, dass AFNetworking tatsächlich sendet:

"buttonActionParam":"\/catalog\/special\/international-calling".

Ich weiß, dass AFNetworking Bibliothek verwendet NSJSONSerialization ‚s Klassenmethode -dataWithJSONObject:, die dies verursacht. Meine Frage ist:

Q. Wie um dieses Problem zu umgehen?

+0

Nicht sicher, dass ich die Frage verstehe: Sie sagen, dass Sie versuchen, "buttonActionParam" zu senden: "/ catalog/special/international-calling", und das ist genau das, was von AFNetworking gesendet wird Problem? –

+0

Redigiert meine Frage. Musste Flucht Zeichen setzen. :) –

+0

Die 'NSData', die aus' NSJSONSerialization' kommen, sind nicht ganz die gleichen wie auf der Serverseite - es zeigt '{" buttonActionParam ":" \/catalog \/special \/international- Aufruf von "}" in meinem Hex-Editor. Ich frage mich, ob es ein Problem mit der Zeichenkodierung ist - es sieht so aus, als ob der Server aus irgendeinem Grund in einem Extra-Escape steckt. –

Antwort

1

Dies ist ein bekanntes Problem. Es verhält sich tatsächlich wie vorgesehen (siehe https://stackoverflow.com/a/20448342/669586).

Es gibt 3 mögliche Lösung:

  1. Machen Sie Ihre Server über die Möglichkeit, die Strings entkommen werden kann. Im Allgemeinen ist dies die beste Lösung.

  2. Verwenden Sie einen anderen JSON-Encoder (z. B. SBJson), und codieren Sie das Objekt NSData, anstatt den standardmäßigen AFNetworking-Serializer zu verwenden.

  3. Encode NSJSONSerialization verwenden und dann die resultierenden Daten an einen es NSString (mit NSUTF8StringEncoding), Desinfizieren konvertieren und es zurück zu NSData konvertieren. Das müssen Sie wiederum tun, bevor Sie das Objekt an AFNetworking übergeben.

Der beste Weg zu implementieren 2 oder 3 ist eine benutzerdefinierte requestSerializer auf der AFHTTPSessionManager Instanz setzen. Ein Beispiel für die Implementierung von 3 finden Sie unter this answer (beachten Sie, dass es in Swift ist).

+0

# 2 wird funktionieren nur wenn SBJson nach AFNetworking verwendet wird. # 3 Ich versuchte es vor dem Posten. Funktioniert nicht. Ich werde # 1 versuchen. –

+0

@DeborshiSaha Nein, es geht hauptsächlich darum, wie Sie den Serializer einrichten.Wenn Sie AFNetworking nicht den Standard-Request-Serializer verwenden lassen (der 'NSJSONSerialization' verwendet), haben Sie kein Problem. – Sulthan

Verwandte Themen