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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

1231閲覧

URLSessionのPOSTについて

hodoru3sei

総合スコア284

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

1クリップ

投稿2019/06/24 08:04

編集2019/06/24 09:36

https://labs.goo.ne.jp/api/jp/hiragana-translation/リンク先のAPIに対してPostを行いたいと考えているのですが、エラーコードが帰ってきてしまいます。

コード

上記2つのサイトを参考にPOSTの処理を試してみました。

Swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 let url = URL(string: "https://labs.goo.ne.jp/api/hiragana") 4 var request = URLRequest(url: url!) 5 request.httpMethod = "POST" 6 request.addValue("application/json", forHTTPHeaderField: "Content-Type") 7 8 let params: [String: Any] = [ 9 "app_id": "作成したapp_id", 10 "request_id": "", "sentence": "焼き芋", 11 "output_type": "hiragana" 12 ] 13 14 do { 15 request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) 16 let task:URLSessionDataTask = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {(data,response,error) -> Void in 17 let resultData = String(data: data!, encoding: .utf8)! 18 print("result:(resultData)") 19 print("response:(response)") 20 }) 21 task.resume() 22 } catch { 23 print("Error:(error)") 24 } 25 }

通信自体はできていそうなのですが、printしているdataの中身を見るとエラーコードが帰ってきているようでした。

ログ

コンソールのログは以下の様に表示されます

result:{"error_code": -1} response:Optional(<NSHTTPURLResponse: 0x280d10600> { URL: https://labs.goo.ne.jp/api/hiragana } { Status Code: 400, Headers { "Content-Length" = ( 18 ); "Content-Type" = ( "application/json; charset=UTF-8" ); Date = ( "Mon, 24 Jun 2019 07:52:09 GMT" ); P3P = ( "policyref=\"/w3c/p3p.xml\",CP=\"CAO DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAi IVDi CONo OUR SAMo OTRo IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC\"" ); "Set-Cookie" = ( "BIGipServerpool-labs-10-2=121902252.20480.0000; path=/; Httponly; Secure", z "TS019127ff=0122c0d7568a528128b5cbc18a059c3de65549546b5e4e4ab05960f1736a72e4f9ea16d828b26345fb2b59c0b617cb4abed40454be27f9bd990125b068de0eacb03dbd61ff; Path=/" ); "X-Cnection" = ( close ); "X-Content-Type-Options" = ( nosniff ); } })

APIにPOSTを行った経験がないので何が悪いのか検討がつかず困っています。何が間違っているのでしょうか?

追記

公式ドキュメントを読んで以下の様なコードに書き換えてみたのですがserver errorの部分に入ってしまいます。

Swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 let url = URL(string: "https://labs.goo.ne.jp/api/hiragana") 4 var request = URLRequest(url: url!) 5 request.httpMethod = "POST" 6 7 request.addValue("application/json", forHTTPHeaderField: "Content-Type") 8 request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 9 10 let postData = PostData(app_id: "作成したapp_id", request_id: "", sentence: "焼き芋", output_type: "hiragana") 11 12 13 guard let uploadData = try? JSONEncoder().encode(postData) else { 14 return 15 } 16 request.httpBody = uploadData 17 18 let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in 19 if let error = error { 20 print ("error: (error)") 21 return 22 } 23 24 guard let response = response as? HTTPURLResponse, 25 (200...299).contains(response.statusCode) else { 26 print ("server error") 27 return 28 } 29 if let mimeType = response.mimeType, 30 mimeType == "application/json", 31 let data = data, 32 let dataString = String(data: data, encoding: .utf8) { 33 print ("got data: (dataString)") 34 } 35 } 36 task.resume() 37 } 38}

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

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

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

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

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

guest

回答1

0

ベストアンサー

HTTPステータス400は一般的にはBad Requestの意味なので、リクエストの仕方が間違っているのだと思います(そのサイトの説明にはないので違う可能性はありますが)。
POSTの送信の仕方は見た感じ最初のコードで問題ないと思います。

後はそのAPIを使ったことないので想像になりますが…

  • request_idが空なのが許されないのかも? request_idを送らないようにするか適当な文字列を指定して試してみては?
  • "作成したapp_id"の部分は自分のapp_idに置き換えてありますよね?

投稿2019/06/24 16:57

u39ueda

総合スコア950

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

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

hodoru3sei

2019/06/25 01:09

回答ありがとうございます! app_idは作成したものを入力しています! API公開ページでrequest_id入れなくても値取得できていた様だったので省略しちゃってました。 request_id辺りで色々試してみようと思います!
hodoru3sei

2019/06/25 01:50

サンプルに記載があったrequest_idを使ったら成功しました! ありがとうございます‼︎自分では全く気づきませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問