2017-12-29 22 views
2

iOSアプリケーションが空のデータをWebサービスに送信しています。私は解決策を見つけるのに数時間を費やしたが、何も働かなかった。 アプリケーションは、kontrah番号をデータベースのトラフphpスクリプトに送信することになっています。次に、データベースは、コントラ番号がデータベースにあるかどうかを認識しなければならない。その後、数値が正しい場合、データベースサーバーから要求があります。問題は、私が送る数字が正しいことです。私はJavaを使用してAndroidのメーカーで同じアプリが、Android上を作ったし、すべてがうまく動作します空のデータを送信するJSONリクエスト

{"kontrah":null,"telefon":null,"opis":null,"afakt":null} 

:私は、データベースに送信し、それがすべて空のされているものをチェックアウト。

マイコード:

@IBAction func submitAction(_ sender: AnyObject) { 
    let kontrah: String = fkontrah.text! 
    let telefon: String = ftelefon.text! 



    let json = [ "kontrah" : (kontrah), "telefon" : (telefon), "opis" : (selectedvalue), "afakt" : (selectedafakt) ] 

    print (json) 

    do { 
     let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted) 
     print(jsonData) 
     // create post request 
     let url = NSURL(string: "http://hetman.pl/ios/post2.php")! 
     let request = NSMutableURLRequest(url: url as URL) 
     request.httpMethod = "POST" 

     // insert json data to the request 
     request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     request.httpBody = jsonData 



     let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in 
      if error != nil{ 
       return 
      } 

      do { 
       let t = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] 
       print(t) 

      } catch { 
       print("Error 43-> \(error)") 
      } 
     } 
     let alert = UIAlertController(title: "Wysłano poprawnie", message: "", preferredStyle: UIAlertControllerStyle.alert) 
     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) 
     self.present(alert, animated: true, completion: nil) 


     task.resume() 


    } 

    catch { 
     //handle error. Probably return or mark function as throws 
     print(error) 
     return 
    } 
} 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.view.endEditing(true) 
} 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 
    return(true) 
} 

} 

ログ:

2017-12-29 15:59:43.867463+0100 Hetman4[10692:4029622] Failed to set (titleLabel.adjustsFontSizeToFitWidth) user defined inspected property on (UITextView): [<UITextView 0x7fa1ad829e00> valueForUndefinedKey:]: this class is not key value coding-compliant for the key titleLabel. 
2017-12-29 15:59:47.717492+0100 Hetman4[10692:4029622] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/bartoszlucinski/Library/Developer/CoreSimulator/Devices/3BE9103E-97CA-4E0B-AE53-6196EE08C49D/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 
2017-12-29 15:59:47.717874+0100 Hetman4[10692:4029622] [MC] Reading from private effective user settings. 
2017-12-29 15:59:52.225804+0100 Hetman4[10692:4029622] Can't find keyplane that supports type 4 for keyboard iPhone-PortraitChoco-NumberPad; using 4072550144015629828_PortraitChoco_iPhone-Simple-Pad_Default 
["telefon": "510356448", "kontrah": "1400-685", "opis": "Świnia", "afakt": "0"] 
94 bytes 
2017-12-29 15:59:57.074868+0100 Hetman4[10692:4029622] Failed to set (titleLabel.adjustsFontSizeToFitWidth) user defined inspected property on (UITextView): [<UITextView 0x7fa1b0096400> valueForUndefinedKey:]: this class is not key value coding-compliant for the key titleLabel. 
2017-12-29 15:59:57.628832+0100 Hetman4[10692:4029622] Presenting view controllers on detached view controllers is discouraged <Hetman4.ViewController: 0x7fa1ac428ef0>. 
Optional(["error": <null>, "result": kontrah doesn't exist, "unAuthorizedRequest": 0, "success": 1]) 

PHPスクリプト:

<?php 
$kontrah = urlencode($_POST['kontrah']); 
$telefon = urlencode($_POST['telefon']); 
$opis = urlencode($_POST['opis']); 
$afakt = urlencode($_POST['afakt']); 

$url = 'https://hetman.e4b.com.pl/api/services/app/zlecenie/FormAddZlecenie?kontrah='.$kontrah.'&telefon='.$telefon.'&opis='.$opis.'&afakt='.&afakt; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); 


$results = curl_exec($ch); 

curl_close($ch); 
?> 
+0

あなたはブレークポイントを使用してkontrah、TELEFON及び他の変数がnullかどうかを確認しようとしなかった

let parameters = ["kontrah" : kontrah, "telefon" : telefon, "opis" : selectedvalue, "afakt" : selectedafakt] let url = URL(string: "http://www.hetman.pl/ios/post2.php")! var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Accept") request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type") request.setBodyContent(parameters) let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print(error ?? "Unknown error") return } do { let t = try JSONSerialization.jsonObject(with: data) as? [String:AnyObject] print(t ?? "Invalid") } catch { print("Error 43-> \(error)") } } task.resume() 

? – IOSDealBreaker

+1

Swiftコードには関係のない小さな問題があります(たとえば、 'NSURL'、' NSURLRequest'ではなく 'URL'と' URLRequest'を使用します)。 PHPは疑わしいと思われる。 ( '$ kontrah'などを' POST'リクエストを作成している場合はURLに追加するのはなぜですか? '$ fields_string'はどこに設定されますか)あなたのAndroidアプリは同じPHPを呼びますと言っていますか? – Rob

+0

Androidアプリから同じPHPが呼び出されています(PHPファイルは私の仕事ではなく、別の会社のプログラマーです)。もう一つ。このコードは9月に完全に機能し、何が起こったのか分かりません。 – Konrad

答えて

0

問題のカップル:

  1. サーバーはJSON要求ではなく、application/x-www-form-urlencodedリクエストを要求しています。応答はJSONですが、リクエストはJSONではありません。

  2. 私はhetman.pl URLを使用しますが、それはwww.hetman.plにリダイレクトするが、GETPOSTを交換しています。私がwww.hetman.plに直接リクエストを送ったとき、私は別のメッセージを受け取りました。しかし、私はそれらを読むことはできませんので、私はこれが良いか悪いかをコメントすることはできません。当面の問題とは無関係

  3. 、スウィフトコードはそれぞれ、URLURLRequestNSURLNSURLRequestを置き換える、TADを片付けすることができます。

一緒にそれを引っ張る、あなたが何かのように取得する:

extension URLRequest { 

    /// Populate the HTTPBody of `application/x-www-form-urlencoded` request 
    /// 
    /// - parameter parameters: A dictionary of keys and values to be added to the request 

    mutating func setBodyContent(_ parameters: [String : String]) { 
     let parameterArray = parameters.map { (key, value) -> String in 
      let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)! 
      let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)! 
      return "\(encodedKey)=\(encodedValue)" 
     } 
     httpBody = parameterArray 
      .joined(separator: "&") 
      .data(using: .utf8) 
    } 
} 

extension CharacterSet { 

    /// Character set containing characters allowed in query value as outlined in RFC 3986. 
    /// 
    /// RFC 3986 states that the following characters are "reserved" characters. 
    /// 
    /// - General Delimiters: ":", "#", "[", "]", "@", "?", "/" 
    /// - Sub-Delimiters: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=" 
    /// 
    /// In RFC 3986 - Section 3.4, it states that the "?" and "/" characters should not be escaped to allow 
    /// query strings to include a URL. Therefore, all "reserved" characters with the exception of "?" and "/" 
    /// should be percent-escaped in the query string. 
    /// 
    /// - parameter string: The string to be percent-escaped. 
    /// 
    /// - returns: The percent-escaped string. 

    static var urlQueryValueAllowed: CharacterSet = { 
     let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 
     let subDelimitersToEncode = "!$&'()*+,;=" 

     var allowed = CharacterSet.urlQueryAllowed 
     allowed.remove(charactersIn: generalDelimitersToEncode + subDelimitersToEncode) 

     return allowed 
    }() 

} 
+0

ああ、ありがとう!私はリクエストが送信され、あなたがそれにどれくらいの時間をかけたかを見たときに電子メールを受け取っています。もう一度ありがとう!あなたは素晴らしいです – Konrad

関連する問題