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

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

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

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

1168閲覧

PUTmethodのAPI接続時エラー ["detail": リクエストのメディアタイプ "" はサポートされていません。]の対応方法

tomaa

総合スコア84

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/11/04 14:26

編集2020/11/04 14:45

前提・実現したいこと

SwiftUIと、Django REST Frameworkを利用してiOSアプリを開発しています。

データ更新用のエンドポイントにPUT methodでアクセスし、対象のデータを更新したいのですが、下記のエラーメッセージ(DRFresponseデータに含まれる)が出て、更新作業ができません。

対応の方法について、ご存知の方おりましたらご教授いただけないでしょうか?

コンソールに表示されるエラーメッセージ

The response code is 415 The request is: ["detail": リクエストのメディアタイプ "" はサポートされていません。]

該当のソースコード

SWIFT

1func makePutCall( 2 pk the_pk:Int, 3 field_name the_field_name:String, 4 memo the_memo:String 5 ) { 6 let pk = the_pk 7 let endpoint: String = "https://sample.com/api/info/(pk)/" 8 9 guard let url = URL(string: endpoint) else { 10 print("Error: cannot create URL") 11 return 12 } 13 var urlRequest = URLRequest(url: url) 14 urlRequest.addValue("token xxxxxxxxxxxxxxxxxxx", forHTTPHeaderField: "authorization") 15 urlRequest.httpMethod = "PUT" 16 urlRequest.httpBody = "field_name=(the_field_name)&memo=(the_memo)".data(using: .utf8) 17 let session = URLSession.shared 18 let task = session.dataTask(with: urlRequest) { 19 (data, response, error) in 20 guard error == nil else { 21 print("error calling PUT") 22 print(error!) 23 return 24 } 25 guard let responseData = data else { 26 print("Error: did not receive data") 27 return 28 } 29 guard let response = response as? HTTPURLResponse else { 30 print("Error: did not response data") 31 return 32 } 33 print("The response code is (response.statusCode)") 34 do { 35 guard let receivedData = try JSONSerialization.jsonObject(with: responseData, 36 options: []) as? [String: Any] else { 37 print("Could not get JSON from responseData as dictionary") 38 return 39 } 40 print("The request is: " + receivedData.description) 41 42 } catch { 43 print("error parsing response from PUT") 44 return 45 } 46 } 47 task.resume() 48 }

試したこと

Content-Typeの指定をするために下記のようにコードを編集すると、エラーメッセージは変わりますが、更新はできません。

...中略 var urlRequest = URLRequest(url: url) urlRequest.addValue("token xxxxxxxxxxxxxxxx", forHTTPHeaderField: "authorization") urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") //←この行を追加 urlRequest.httpMethod = "PUT" ...中略

コンソールに表示されるエラーメッセージ

The response code is 400 The request is: ["detail": JSON parse error - Expecting value: line 1 column 1 (char 0)]

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

Xcode:Version 12.0.1

DjangoRESTframework: 3.12.1

Django:3.1.2

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問