2017-09-13 47 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 . "]";