Obj-C - POST JSON Daten zum Server?

8

Entschuldige die neue Frage, aber ich raufe mir die Haare aus. Ich kann Daten erfolgreich über ein Programm wie FireFox POSTER an meine Endpunkt-URL POST. Ich versuche jedoch, dieselben JSON-Daten von meiner App an meine Endpunkt-URL zu senden (Endpunkt der Drupal-Dienste push_notifications), und aus irgendeinem Grund wird sie nicht erfolgreich POST. Hier ist der Code, den ich verwende:

ViewController.m

%Vor%

Hinweis: Ich habe diesen Code NACH dem Anmelden meines Benutzers erfolgreich angemeldet. Daher bin ich mir nicht sicher, ob eine neue Verbindung erforderlich ist. Wie kann ich meine Daten an den Server senden, wenn eine Sitzung und ein CSRF-Token bereits existieren? Wie soll mein Code aussehen? Wer diese Frage beantwortet, geht auf meine Weihnachtsliste ... O_O

NSLog-Antwort:

%Vor%     
Brittany 29.06.2017, 00:58
quelle

4 Antworten

2

Toms Antwort gibt die richtige Richtung, aber ich sehe die fehlende Beschreibung, was der Code tatsächlich macht, ist für Sie verwirrend. Außerdem verwenden Sie veraltete Methoden (von NSURLConnection ), daher habe ich ein schnelles (ungetestetes) Beispiel mit NSURLSession und den zugehörigen Klassen erstellt. Mach dir keine Sorgen, es ist im Grunde das Gleiche.

Wenn Sie dies in Ihrem ursprünglichen Code ausprobieren, frage ich mich, ob Sie tatsächlich einen JSON-Body senden (d. h. Ihr Backend erwartet das) oder vielmehr das System beruht auf langweiligen Parametern für die URL. Also habe ich beide Möglichkeiten in meinen Code eingefügt:

%Vor%

Es ist auch möglich, dass Ihr Backend beides unterstützt, aber es ist immer hilfreich, zu lernen, wie man einen richtigen JSON-Körper erstellt. Beachten Sie, dass der Grund dafür ist, dass Sie scheinbar missverstehen, wie NSURLConnection funktioniert (es sei denn, Sie haben Code ausgeschlossen, auf den Sie sich verlassen): Das Objekt wird immer so konstruiert, wie Sie es verwenden, also if (conn) befindet sich immer im Zweig YES . Das bedeutet nicht, dass die Verbindung, d. H. Das tatsächliche Laden, erfolgreich ist. Der Initializer gibt nil zurück, wenn eine Instanz nicht erstellt werden kann, und nicht, wenn eine gültige Instanz nur auf Daten basiert, die bei der Verbindung mit ihrem Ziel abgelehnt wurden. Auf diese Weise erhalten Sie keinen Fehler (Sie müssen sich dabei auf die Delegierung verlassen).

Der von mir gezeigte Sitzungsansatz gibt Ihnen einen Abschlussblock, in dem Sie untersuchen können, was der Server antwortet, um herauszufinden, was schief gelaufen ist. Sie können dort einfach einen Haltepunkt setzen und den Fehler betrachten (was nil ist, wenn es erfolgreich ist), den Status in der Antwort etc.

Ich habe diesen genauen Code natürlich nicht ausgeführt, also entschuldigen Sie alle Tippfehler, aber ich habe diesen Ansatz sehr oft beim Laden und Senden an eine Vielzahl von Backends für meine übliche Arbeit verwendet. Im Allgemeinen sollte es funktionieren (und, was noch wichtiger ist, Sie können herausfinden, was zum Teufel Ihr Backend erwartet, vorausgesetzt, Sie haben keine detaillierten Dokumente darüber).

Bearbeiten :

Okay, dieser Hinweis im Code-Kommentar war vielleicht irreführend: Ich wollte die Antwort auf Fehler überprüfen. Das response -Objekt (siehe auch die Dokumentation für die Methode dataTask... im Allgemeinen). Ich habe Code hinzugefügt, der ein bisschen dabei hilft, aber bitte beachten Sie, dass die Konvertierung des data -Objekts in JSON davon abhängt, was passiert und ob Ihr Server tatsächlich irgendwelche Daten übergibt. Oder es könnte ein seltsames Format oder etwas haben, das müssen Sie herausfinden. Für einfache Sachen, die POST bekommen, liefert es möglicherweise keine Daten, Sie erhalten einfach eine entsprechende Information darüber, ob es in response funktioniert oder nicht. Beachten Sie insbesondere NSHTTPURLResponse s statusCode Eigenschaft. Es sei denn, Ihr Server macht etwas Seltsames, das ist der HTTP-Statuscode , der vom Standard definiert wird und Ihnen helfen sollte. Wenn zum Beispiel die Art und Weise, in der du deinen Körper in der Anfrage konstruiert hast (der jsonBodyDict in meinem Beispielcode) falsch war (falsche Elementnamen oder ähnliches), erhältst du eine 400.

Im Allgemeinen muss man verstehen, dass die Bedeutung von "Fehler" hier nicht so einfach ist. Die Methoden betrachten es überhaupt nicht möglich, eine Verbindung als Fehler herzustellen, daher erhalten Sie in diesen Fällen ein Fehlerobjekt im Abschlussblock. Dies ist typischerweise der Fall, wenn Ihr Server einfach nicht existiert oder ähnliches. Wenn Sie jedoch Ihre beabsichtigten Informationen einfach nicht an Ihren Server übermitteln, handelt es sich nicht um einen Fehler aus der API-Perspektive, und Sie erhalten kein Fehlerobjekt. Sie erhalten eine gültige Antwort mit der Meldung "Diese Anfrage war fehlerhaft". Ihnen geht es schon gut, denn die Verbindung scheint zu funktionieren und Sie senden gerade noch nicht die Daten, die Ihr Server erwartet. Die response sollte mehr Informationen dazu geben.

Um dies weiter zu debuggen, würde dies den Rahmen dieser Frage noch weiter sprengen, da wir uns schließlich darüber unterhalten, wie sich Ihr spezifisches Backend jetzt verhält. Wenn Sie das nicht herausfinden können, müssen Sie mir die Zugangsdaten für Ihren Server geben, damit ich es selbst testen kann, alles andere würde jetzt von mir ausgehen. :) Wir können das tun, aber es ist wahrscheinlich am besten, dies im Chat zu tun und nicht in einer Frage / Antwort, die schon so lange ist, hehe.

    
Gero 05.07.2017, 10:09
quelle
5

Alle Antworten sind gut, aber ich poste eine Methode, für die korrekte Implementierung von JSON data in POST API

POST-Methode

%Vor%

Verwendet:

%Vor%

Ich hoffe, das wird dir helfen

    
Dhiru 05.07.2017 12:16
quelle
1
%Vor%     
tomfriwel 29.06.2017 01:20
quelle
1

Sollen Ihre JSON-Daten in der Form von String oder Dictionary sein, wie von tom

gesagt

NSString *post = [NSString stringWithFormat:@"token=%@&type=%@",postDeviceID,@"ios"]; - Stimmt es?

Wenn JA.

Können Sie mit Asynchronous Request mit NSURLConnection anstelle von Delegate-Methoden überprüfen.

%Vor%

Ich hoffe, es hilft.

    
Vidhyanand 03.07.2017 04:50
quelle

Tags und Links