2017-09-13 80 views
0

我使用Guzzle從PHP調用公共API。它返回有效的JSON(在JSONLint.com上進行驗證)。但是,當我嘗試將其返回給我的iOS應用程序時,Alamofire不喜歡它。我嘗試解碼JSON,然後重新編碼它,但我得到相同的結果。我無法弄清楚爲什麼Alamofire不會接受它。我已經使用Paw測試了Web服務,並且它返回了content-typeapplication/json的JSON結果。Alamofire不會將結果識別爲JSON

我得到的錯誤是:

JSON could not be serialized because of error: The data couldn’t be read because it isn’t in the correct format.

PHP代碼:

$url = "myUrl"; 
$client = new GuzzleHttp\Client(); 

$res = $client->get($url, [ 
'headers' => [ 
    'Authorization' => "Bearer myKey", 
    'Accept' => 'application/json' 
    ] 
]); 

header('Content-type: application/json'); 
$results = $res->getBody(); 
$this->response($results, 200); 

斯威夫特代碼:

let url = serviceUrl + "currentwar"  
let params = [ 
    "clanId" : "\(clanId)", 
] 

Alamofire.request(url, parameters: params, encoding: URLEncoding.default) 
    .validate() 
    .responseJSON { (response) in 
     switch response.result { 
     case .success(let data): 
      self.json = JSON(data) 
      print(self.json as Any) 

      // process data 

      DispatchQueue.main.async(execute: {() -> Void in 
       // populate view 
      }) 

     case .failure(let error): 
      print("An error occurred: \(error.localizedDescription)") 
     } 
} 
+0

嘗試使用'responseString',而不是'responseJSON'和字符串轉換成JSON和解析。 –

+0

@BadhanGanesh,我試過這個,但似乎無法對結果字符串做任何事情。將其轉換爲JSON只返回null。 – Lastmboy

回答

0

嘗試從REST客戶端,檢查出的API,例如Postman到驗證結果。由於瀏覽器可以呈現HTML內容,因此您可能無法在瀏覽器窗口中看到它,但您可以輕鬆地從頁面源視圖中檢查該內容。 我總是檢查Postman中的API,因爲它確保從服務器端的API中沒有錯誤,並且API使用者可以輕鬆使用該API。

+0

正如我在我的文章中提到的,我使用Paw作爲我的REST客戶端(本地應用比Postman好得多)。另外,我提到我在JSONLint.com上驗證了JSON。也就是說,我也通過Postman運行它,並獲得有效的JSON。 – Lastmboy

0

我能夠通過將JSON包裝在方括號中來使其工作。

$result = "[" . $result . "]";