Czytam język programowania Swift firmy Apple w iBooks, ale nie mogę zrozumieć, jak wykonać żądanie HTTP (coś w rodzaju cURL) w Swift. Czy muszę importować klasy Obj-C, czy po prostu muszę importować biblioteki domyślne? A może nie można wysłać żądania HTTP na podstawie natywnego kodu Swift?
ios
objective-c
swift
iphone
nsurlsession
Dicky Tsang
źródło
źródło
Odpowiedzi:
Można używać
URL
,URLRequest
iURLSession
czyNSURLConnection
, jak można normalnie zrobić w Objective-C. Pamiętaj, że dla iOS 7.0 i nowszychURLSession
jest preferowany.Za pomocą
URLSession
Zainicjuj
URL
obiekt iURLSessionDataTask
odURLSession
. Następnie uruchom zadanie za pomocąresume()
.Za pomocą
NSURLConnection
Najpierw zainicjuj
URL
ai aURLRequest
:Następnie możesz załadować żądanie asynchronicznie za pomocą:
Lub możesz zainicjować
NSURLConnection
:Po prostu upewnij się, że ustawiłeś swojego delegata na coś innego
nil
i użyj metod delegowania do pracy z odpowiedzią i otrzymanymi danymi.Aby uzyskać więcej informacji, sprawdź dokumentację
NSURLConnectionDataDelegate
protokołuTestowanie na placu zabaw Xcode
Jeśli chcesz wypróbować ten kod na placu zabaw Xcode, dodaj
import PlaygroundSupport
do niego plac zabaw, a także następujące połączenie:Umożliwi to użycie kodu asynchronicznego na placach zabaw.
źródło
print(String(data: data!, encoding: String.Encoding.utf8))
Sprawdź poniższe kody:
1. SynchonousRequest
Swift 1.2
Swift 2.0 +
2. AsynchonousRequest
Swift 1.2
Swift 2.0 +
3. Jak zwykle połączenie URL
Swift 1.2
Następnie
Swift 2.0 +
Następnie
4. Asynchoniczne żądanie POST
Swift 1.2
Swift 2.0 +
5. Asynchoniczne żądanie GET
Swift 1.2
Swift 2.0 +
6. Przesyłanie obrazu (pliku)
Swift 2.0 +
źródło
Inną opcją jest biblioteka Alamofire, która oferuje metody Chainable Request / Response.
https://github.com/Alamofire/Alamofire
Składam prośbę
Obsługa odpowiedzi
źródło
URLSession
i małżonki. Również akceptacja nie jest miarą jakiejś abstrakcyjnej miary dobroci (nie mówiąc już o twojej!;)), Ale tego, co najbardziej pomogło OP. (Dla „czystych” rozwiązań istnieje Dokumentacja SO!) Jeśli to była ta odpowiedź, idealnie - nie stosuje się pierwszych zasad, ale wtedy nie zawsze jest to „właściwe” rozwiązanie, prawda?Swift 4 i wyżej: Żądanie danych przy użyciu interfejsu API URLSession
Swift 4 i wyżej, dekodowalne i wyliczanie wyników
przykład:
// jeśli chcemy pobrać todo z zastępczego API, wówczas definiujemy strukturę ToDo i wywołujemy dataRequest i przekazujemy ciąg znaków „ https://jsonplaceholder.typicode.com/todos/1 ”.
// to wypisuje wynik:
źródło
Podstawowe rozwiązanie Swift 3+
źródło
URL(string: "http://www.stackoverflow.com")
zamiastNSURL
URLSession.shared.dataTask(with: url!)
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
Używam otoki tego gościa z jak dotąd dobrymi wynikami https://github.com/daltoniam/swiftHTTP . Żadnych dużych nieszczelnych abstrakcjiJak dotąd
Przykład
źródło
Detale
Info.plist
NSAppTransportSecurity
Dodaj do listy informacji:
Próbka Alamofire
Alamofire
Zastosowanie próbki Alamofire
Próbka URLSession
Wykorzystanie próbki URLSession
Wyniki
źródło
class func searchRequest(term: String, ...
to próbka danych do pobrania z itunes.apple.com. Ta próbka będzie wyszukiwać, więc wybrałem / wymyśliłemsearchRequest
nazwę funkcji.term
jest częścią „ itunes.apple.com/search ?” żądanie. Możesz wybrać dowolne nazwy swoich funkcji, które opisają Twój model logiczny.closure
aby zwracać wyliczenie ze sprawamisuccess
ierror
.Zrobiłem żądanie HTTP Obie metody GET & POST z JSON Parsing w ten sposób:
on viewDidLoad () :
Gotowy
źródło
Korzystanie z URLSession + Swift 5
Po prostu dodając do odpowiedzi cezara, jeśli chcesz złożyć żądanie sieciowe za pomocą klasy URLSession firmy Apple, istnieje wiele sposobów wykonania zadania
1. Proste żądanie GET z adresem URL
2. Proste żądanie GET z adresem URL i parametrami
3. Proste żądanie GET z adresem URL z obsługą błędów
4. Proste żądanie POST z adresem URL, parametry z obsługą błędów.
Twoje sugestie są mile widziane !!
źródło
var session = URLSession.shared
gdy go nie używasz, a jedynie zastępujesz zmienną? Czy to jest potrzebneTutaj stworzyłem osobny słownik parametrów.
źródło
Możesz użyć Just ,
python-requests
stylowej biblioteki HTTP.Oto przykład wysyłania żądania HTTP za pomocą Just:
W obu przypadkach dostęp do wyniku zapytania
r
można uzyskać w podobny sposóbpython-request
:Możesz znaleźć więcej przykładów na tym placu zabaw
Używanie tej biblioteki w trybie synchronicznym na placu zabaw jest najbliższą opcją CURL w Swift.
źródło
W Swift 4.1 i Xcode 9.4.1.
Przykład podejścia JSON POST . Aby sprawdzić połączenie internetowe, dodaj pliki Reachability.h & .m z https://developer.apple.com/library/archive/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2
Jeśli chcesz skorzystać z tej funkcji w SharedClass
I wreszcie wywołaj tę funkcję w ten sposób ....
źródło
Proste podejście Swift 2.0 do tworzenia żądania HTTP GET
Żądanie HTTP jest asynchroniczne, dlatego potrzebujesz sposobu na uzyskanie zwróconej wartości z żądania HTTP. To podejście wykorzystuje Powiadomienia i jest podzielone na dwie klasy.
Przykładem jest sprawdzenie nazwy użytkownika i hasła tokena identyfikacyjnego za pomocą strony internetowej http://www.example.com/handler.php?do=CheckUserJson&json= To znaczy, że plik nazywa się handler.php i ma instrukcję switch na wykonaj parametr, aby uzyskać podejście RESTful.
W viewDidLoad konfigurujemy NotifierObserver, konfigurujemy json i wykonujemy wywołanie funkcji getHTTPRequest. Nastąpi powrót do funkcji selectedUsernameAndPassword z parametrem zwróconym z żądania http.
W Utility.swift są dwie funkcje statyczne, najpierw do kodowania json, a następnie do wykonania połączenia HTTP.
i żądanie HTTP
Funkcja sendNotification uzupełnia okrąg. Zauważ, że w Observer znajduje się znak „:” na końcu łańcucha selektora. Dzięki temu powiadomienie może przenosić ładunek w userInfo. Daję to ciąg i int.
Pamiętaj, że korzystanie z HTTP jest staromodne, wolisz HTTPS, patrz Jak załadować adres URL HTTP z włączoną aplikacją Security Transport w iOS 9?
źródło
to na pewno ci pomoże
źródło
// Oto przykład, który zadziałał dla mnie
// Szybka funkcja wysyłająca zapytanie do serwera z kluczowymi wartościami
Kod PHP, aby uzyskać kluczowe wartości
$ empID = $ _POST ['id'];
$ inOut = $ _POST ['inout'];
$ comment = $ _POST ['comment'];
źródło
Oto bardzo prosty przykład Swift 4 na placu zabaw:
źródło
Aby XCUITest zatrzymał zakończenie testu przed zakończeniem żądania asynchronizacji, użyj tego (może skrócić limit czasu 100):
źródło
Odpowiedź KISS:
źródło
Przykład przykładowego żądania „GET” podano poniżej.
źródło