Help us understand the problem. What is going on with this article?

QiitaのAPIを呼ぶときに末尾にスラッシュをつけるとhttp://~にリダイレクトされるので気をつけましょう

TL;DR

タイトル通り。curlの結果はこちら

iOS懐かしのエラー

昔よく見たエラーにふとした拍子に出くわししました:yum: 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のはず……:thinking:

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.}

:astonished:?!:astonished:

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")!

:rolling_eyes: よく見ると、URLの末尾にスラッシュがついている……? :rolling_eyes:

え?でも、この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>

:astonished:?!:astonished:

:innocent:なぜかhttpにリダイレクトされています:innocent:3

QiitaのAPIを使うときは、末尾のスラッシュに気をつけましょう

という結論でした:see_no_evil:

let url = URL(string: "https://qiita.com/api/v2/items?per_page=3")!

万が一同じ現象に遭遇した人がいれば、ここに辿り着けますように。


  1. リリース前の開発ではいまでもよく見るかもしれませんね。 

  2. 当初はmacOSのプロジェクトで試していたため、普段触ることのないサンドボックスの設定などを疑っていたため、どハマりしてしまいました。 

  3. そういえば調査の途中でcurl使ったときには、無意識に-Lオプションをつけていたような……:thinking: 

turara
iOS / Android / TypeScriptでアプリ開発をしています。最近はiOSがメイン。発信力を高めていきたい。
https://twitter.com/turara_engeneer
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。
https://community.camp-fire.jp/projects/view/280040
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした