2016-05-25 6 views
0

I URL mit NSURL basierend erschaffe und dann NSURLSession verwenden, um eine Datei auf ein REST API (self.prefix zu senden ist eine Zeichenkette wieMit NSURLSession mit HTTP REST API auf IOS in Swift

/var/mobile/Applications/39FEBF47-6B74-48F2-8484-638D4B79A5FC/Documents/app/s7UqOoLJcI7tUCB/file.png).

let UUID: String = "'UUID:" + (randomStringWithLength(32) as String) + "' " 

let ContentType: String = "Content-Type:image/png < " 

let str: String = "http://link/convert 'X-Auth-Token:a351sfddsf2cbcce8' 'X-Project-ID:2222' " + UUID + ContentType + self.prefix 

let url = NSURL(string: str) 
     let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 
      print(NSString(data: data!, encoding: NSUTF8StringEncoding)) 
     } 

task.resume() 

I bin

bekommen

"fatal error: unexpectedly found nil while unwrapping an Optional value"

weil URL null ist. Was soll ich tun, um richtig die URL zu konstruieren mit einer REST-API zu kommunizieren?

Dies ist, wie die Interaktion mit dem API in der Befehlszeile aus:

http link:80/action 'X-Auth-Token:a3s33cfeffswffffs5454534bcce8' 'X-Project-ID:1234' 'UUID:abcdef123456' Content-Type:image/jpg < ~/Downloads/file.jpg

ich derzeit eine HTTP-Anforderung wie unten erstellen, aber keine Antwort nicht sehen kann.

 self.currentImage.image = tempImage 

     let body = NSMutableData() 
     let boundary = generateBoundaryString() 
     let fname = self.prefix 
     let mimetype = "image/png" 

     let imageData: NSData = UIImagePNGRepresentation(self.currentImage.image!)! 


     let UUID: String = randomStringWithLength(12) as String 
     let url = NSURL(string: "http://aaaa/bbb")! 

     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "POST" 
     request.setValue("image/png", forHTTPHeaderField: "Content-Type") 
     request.setValue("aa", forHTTPHeaderField: "X-Auth-Token") 
     request.setValue("aaa", forHTTPHeaderField: "X-Project-ID") 
     request.setValue(UUID, forHTTPHeaderField: "UUID") 
     request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 

     body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("Content-Disposition:form-data; name=\"test\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("hi\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 

     body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("Content-Disposition:form-data; name=\"file\"; filename=\"\(fname)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData(imageData) 
     body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 


     body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 

     request.HTTPBody = body 

     let session = NSURLSession.sharedSession() 

     let task = session.dataTaskWithRequest(request) { data, response, error in 
      if let response = response, data = data { 
       print(String(data: data, encoding: NSUTF8StringEncoding)) 
      } 
     } 


     task.resume() 
+0

Bitte zeigen Sie ein Beispiel dafür, was eine gültige URL sein würde. Ihr "in der Befehlszeile" Beispiel wäre keine gültige URL. – Moritz

+0

@EricD Die Interaktion mit der URL im Kommandozeilenbeispiel ist http (https://github.com/jkbrzt/httpie) und erst dann startet die URL - die URL beginnt mit link: 80. Also, zum Beispiel, abc/action 'X-Auth-Token: a3513cf345345345' 'X-Projekt-ID: 845c3' 'UUID: abcdef123456' Content-Type: image/png <~/Downloads/file.png – tesgoe

+0

Dies ist * Nicht * eine URL, dies ist eine Befehlszeile mit Parametern. – Moritz

Antwort

1

Ein paar Dinge sind falsch hier denke ich ...

1/Die URL, die Sie dort gebaut haben keine URL ist ... Was Sie versuchen, eine Anforderung mit Header zu bauen. Tun Sie dies eher:

let url = NSURL(string: "http://link.com/convert")! 

let request = NSMutableURLRequest(URL: url) 
request.HTTPMethod = "POST" 
request.setValue("image/png", forHTTPHeaderField: "Content-Type") 
request.setValue("a351sfddsf2cbcce8", forHTTPHeaderField: "X-Auth_Token") 
request.setValue("2222", forHTTPHeaderField: "X-Project-ID") 

Dann erstellen die NSURLSession

let session = NSURLSession.sharedSession() 

Erstellen Sie dann die Aufgabe

let task = session.dataTaskWithRequest(request) { data, response, error in 
    if let response = response, data = data { 
     print(String(data: data, encoding: NSUTF8StringEncoding)) 
    } 
} 

Dann senden Sie es!

task.resume() 

ANMERKUNG: Ich habe Ihre self.prefix in die URL hinzugefügt ... Sie werden wahrscheinlich brauchen diese Nutzlast oder etwas ist im Antrag stellen ... Aber das wird Ihre URL null Probleme zu lösen und ist eine nette Art und Weise

auch

Ihr URL-Link http://link/convert eine POST-Anforderung an ein REST-API zu tun, ist nicht gültig

+0

Ich habe einen gültigen Link. Es ist nur eine einfachere Form angegeben. – tesgoe

+0

Großartig - sagte nur, dass für den Fall :) –

+0

Und wie füge ich eine Datei zu dieser POST-Anfrage mit setValue gegeben, dass ich eine Datei auf meiner Festplatte habe ich gesendet wie Content-Type: image/jpg <~/Downloads /file.jpg – tesgoe

Verwandte Themen