質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1370閲覧

Swift:URLSessionでPostした情報が、その後、Getできない。

2319

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/09/10 16:31

編集2021/09/13 02:13

前提・実現したいこと

URLSesstion(Post)で商品をカートに入れたい。

発生している問題・エラーメッセージ

とあるサイトに対して、URLSesstion(Post)で商品をカートに入れた後に、URLSesstion(Get)でカートの中身を取得してもカートに中身がありません。(取得したjsonを表示すると [] になります)。

どのような原因が考えられるでしょうか。解決策はあるでしょうか。

該当のソースコード

Swift

1// 商品をカートに入れる処理 2static func cartin() { 3 4 var request = URLRequest(url: URL(string: "https://example/add"))!) 5 let postData: [String: Any] = [...省略...] 6 request.httpMethod = "POST" 7 guard let httpBody = try? JSONSerialization.data(withJSONObject: postData, options: []) else { return } 8 request.httpBody = httpBody 9 URLSession.shared.dataTask(with: request) { (data, response, error) in 10 if error == nil, let response = response as? HTTPURLResponse { 11 print("Content-Type: (response.allHeaderFields["Content-Type"] ?? "")") 12 print("statusCode: (response.statusCode)") 13 self.showCart() 14 } 15 }.resume() 16} 17 18// カートの中身を確認する処理 19static func showCart() 20{ 21 let request = URLRequest(url: URL(string: "https://example/cart.json")!) 22 //20210913追加 23 request.setValue("_session_id=XXXXX", forHTTPHeaderField: "Cookie") 24 URLSession.shared.dataTask(with: request) { (data, response, error) in 25 if error == nil, let response = response as? HTTPURLResponse, let data = data { 26 print("Content-Type: (response.allHeaderFields["Content-Type"] ?? "")") 27 print("statusCode: (response.statusCode)") 28 let json = String(data: data, encoding: .utf8)! 29 print(json) // !! 30 } 31 }.resume() 32}

試したこと

URLSessionConfiguration.defaultの使用:解決せず。
同じコードをChrome拡張機能(ajax)で実装:問題なくカートの中身が取得できます。
(2021/09/13追記)
一連の流れをブラウザで確認したところ、カートに入れたときの応答ヘッダーのContent-Typeはtext/javascriptで、Set-CookieにsessionIdが含まれていました。その後、カート内容表示する際にsessionIdを渡していました。
当プログラムのカート内容表示処理(showCart())で、sessionIdを設定したところ正常にカート内容が表示されました。
ただ、当プログラムのカートに入れる処理(cartin())で返ってくるContent-Typeはtext/htmlで、そのhtmlを確認するとDOMContentLoadedでsessionIdを作成しているようでした。WKWebView等で実装しないとダメなのかもしれないです。。。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2021/09/10 21:15

Webサイト側の処理が分かりませんが、Cookie を使ってユーザー判別していたりするのでしょうか?
hoshi-takanori

2021/09/10 22:15

POST 時に Content-Type: application/json が必要とか?
2319

2021/09/11 04:41 編集

CHERRYさん 例えばChromeでカートに入れて、Firefoxでカートを見るとカートの中身がないのでCookieを使ってると思います。おそらくCookieだと思うのですが調べてもやり方がわからず… hoshi-takanoriさん ありがとうございます。確認してみます。
hoshi-takanori

2021/09/11 06:16

URLSession は自動的にクッキーを処理する (それはそれで怖い…) ので、add の時に Set-Cookie されたら cart.json で Cookie が送られるはずです。で、add の時に Cookie を受け取ったかどうかは print("Set-Cookie: \(response.allHeaderFields["Set-Cookie"] ?? "")") とかで分かるのでは。他にもいろいろ表示してる内容をまず確認してみては。
2319

2021/09/11 07:04

hoshi-takanori ありがとうございます。なんとなるやるべきことはわかりました。一度確認してみます。また報告します!
2319

2021/09/13 00:32

hoshi-takanoriさん Cookie周りを確認して「試したこと」に追記いたしました。当プログラムだけでは難しいのでしょうか。。。
hoshi-takanori

2021/09/13 01:28

よく分かりませんが、同じ add リクエストに対して、ブラウザとアプリでは返ってくるものが違うと言うことでしょうか。そして、ブラウザではレスポンスの Content-Type が application/json ではなく text/javascript ってことは jsonp かな。add のレスポンスの data の中身も確認しましょう。また、add の URL やデータが同じなら、違いはヘッダーだと思うので、ブラウザが送ってるヘッダー (Accepts とか?) も確認しましょう。 それから、「sessionIdを設定したところ」というのは Cookie ヘッダーを明示的に設定したと言うことでしょうか? 全体的に説明が曖昧なので、コードやログで示していただけると助かります。(というか、差し支えなければ「とあるサイト」がどこなのかを…。)
2319

2021/09/13 02:23

曖昧な説明になり申し訳ないです。。。 「sessionIdを設定したところ」はソースコードに追記しました。ブラウザでカートに入れる処理をした際に返ってきたsessionIdを、アプリのshowCart()で直接設定してみてうまくいくか試したところ、カート内容が表示されたという流れになります。 ここではとあるサイトを出せないので、、、ヘッダーの違いを確認しようと思います。まずは知識が追いついていない(jsonpって何?)のでその辺りも勉強してきます。ありがとうございます!
guest

回答1

0

自己解決

本質的ではないですが、WKWebViewで同様の処理を実現できたため、解決済みとします。
ありがとうございました。

投稿2021/09/14 07:29

2319

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問