TL;DR
タイトル通り。curlの結果はこちら。
iOS懐かしのエラー
昔よく見たエラーにふとした拍子に出くわししました 1
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.
これはメッセージの通り、HTTP通信をしようとしたときにiOSがブロックしてくる奴です。
QiitaのAPIを呼ぼうとしていた
URLSession
に渡しているurlは間違いなくhttpsのはず……
let url = URL(string: "https://qiita.com/api/v2/items/?per_page=3")!
let task = urlSession.dataTask(with: url) { data, response, error in
...
エラーメッセージを確認してみる
- Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x6000007b4b40 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=http://qiita.com/api/v2/items, NSErrorFailingURLKey=http://qiita.com/api/v2/items, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}
?!
NSErrorFailingURLKey=http://qiita.com/api/v2/items?per_page=3
なぜだかわかりませんが、URLスキームがhttpに変わっています???
そして、ローカルホストに繋いだりするときと同じように、App Transport Security Settings の Allow Arbitrary Loads を YES に設定すると問題なく結果が返ってきました。
犯人は……?
小一時間ハマったのち、ようやく犯人が見つかりました。2
let url = URL(string: "https://qiita.com/api/v2/items/?per_page=3")!
よく見ると、URLの末尾にスラッシュがついている……?
え?でも、このURLをcurlで叩いても普通にレスポンスが返ってきてたような?
もう一度curlで叩いてみた
$ curl -D - https://qiita.com/api/v2/items/
HTTP/2 301
date: Tue, 15 Sep 2020 12:45:32 GMT
content-type: text/html
content-length: 178
location: http://qiita.com/api/v2/items
server: nginx
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
?!
なぜかhttpにリダイレクトされています3
QiitaのAPIを使うときは、末尾のスラッシュに気をつけましょう
という結論でした
let url = URL(string: "https://qiita.com/api/v2/items?per_page=3")!
万が一同じ現象に遭遇した人がいれば、ここに辿り着けますように。