質問編集履歴

4

検証の追記

2019/10/13 16:09

投稿

hodoru3sei
hodoru3sei

スコア284

test CHANGED
@@ -1 +1 @@
1
- APIからの突然取れなくなってしまった
1
+ APIからのResponseで400ってきてしま
test CHANGED
@@ -197,3 +197,29 @@
197
197
  }
198
198
 
199
199
  ```
200
+
201
+
202
+
203
+ ### 追記その2
204
+
205
+ uploadDataの値をstrihg型に変換してみたところ以下のような値が出力されました
206
+
207
+ ```
208
+
209
+ {"output_type":"hiragana","request_id":"record003","app_id":"作成したID","sentence":"変換する文字列"}
210
+
211
+ ```
212
+
213
+
214
+
215
+ サイトにサンプルとして用意されていた入力例のjsonは以下のものでした
216
+
217
+ ```
218
+
219
+ {"app_id":"[発行されたapp_id]", "request_id":"record003", "sentence":"漢字が混ざっている文章", "output_type":"hiragana"}
220
+
221
+ ```
222
+
223
+
224
+
225
+ json自体に間違いはなさそうなんですがpostしている部分が間違っているのでしょうか?それともAPI自体に何か問題があるのでしょうか

3

コードの追記

2019/10/13 16:09

投稿

hodoru3sei
hodoru3sei

スコア284

test CHANGED
File without changes
test CHANGED
@@ -91,3 +91,109 @@
91
91
  }
92
92
 
93
93
  ```
94
+
95
+
96
+
97
+ 処理を行なっているロジック部分のコードは以下になります。[ひらがな化APIのコンソール](https://labs.goo.ne.jp/api/jp/hiragana-translation/)で試すと問題なく翻訳された値が帰ってきます。
98
+
99
+ どこが間違っているのでしょうか?
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+ ```
108
+
109
+ struct PostData: Codable {
110
+
111
+ var app_id:String
112
+
113
+ var request_id: String
114
+
115
+ var sentence: String
116
+
117
+ var output_type: String
118
+
119
+ }
120
+
121
+ ...省略
122
+
123
+
124
+
125
+ override func viewDidLoad() {
126
+
127
+ super.viewDidLoad()
128
+
129
+ let url = URL(string: "https://labs.goo.ne.jp/api/hiragana")
130
+
131
+ var request = URLRequest(url: url!)
132
+
133
+ request.httpMethod = "POST"
134
+
135
+
136
+
137
+ request.addValue("application/json", forHTTPHeaderField: "Content-Type")
138
+
139
+ request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
140
+
141
+
142
+
143
+ let postData = PostData(app_id: "作成したID", request_id: "record003", sentence: "漢字が含まれた文章", output_type: "hiragana")
144
+
145
+
146
+
147
+
148
+
149
+ guard let uploadData = try? JSONEncoder().encode(postData) else {
150
+
151
+ return
152
+
153
+ }
154
+
155
+ request.httpBody = uploadData
156
+
157
+
158
+
159
+ let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in
160
+
161
+ if let error = error {
162
+
163
+ print ("error: (error)")
164
+
165
+ return
166
+
167
+ }
168
+
169
+
170
+
171
+ guard let response = response as? HTTPURLResponse,
172
+
173
+ (200...299).contains(response.statusCode) else {
174
+
175
+ print ("server error")
176
+
177
+ return
178
+
179
+ }
180
+
181
+ if let mimeType = response.mimeType,
182
+
183
+ mimeType == "application/json",
184
+
185
+ let data = data,
186
+
187
+ let dataString = String(data: data, encoding: .utf8) {
188
+
189
+ print ("got data: (dataString)")
190
+
191
+ }
192
+
193
+ }
194
+
195
+ task.resume()
196
+
197
+ }
198
+
199
+ ```

2

検証の追記

2019/10/11 14:47

投稿

hodoru3sei
hodoru3sei

スコア284

test CHANGED
File without changes
test CHANGED
@@ -65,3 +65,29 @@
65
65
 
66
66
 
67
67
  NSURLResponse型をHTTPURLResponseにしてデータを取り出したいのですがどうしたら良いのでしょうか?
68
+
69
+
70
+
71
+ ## 追記
72
+
73
+
74
+
75
+ いただいたアドバイスを参考に以下のコードで調べてみたところresponseCodeで400がかえってきてしまっているようでした。
76
+
77
+ ```
78
+
79
+ guard let response = response as? HTTPURLResponse else {
80
+
81
+ return
82
+
83
+ }
84
+
85
+ let code = response.statusCode
86
+
87
+ if !(200...299).contains(response.statusCode) {
88
+
89
+ return
90
+
91
+ }
92
+
93
+ ```

1

コードの修正

2019/10/11 14:19

投稿

hodoru3sei
hodoru3sei

スコア284

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
 
10
10
 
11
- ```
11
+ ```Swift
12
+
13
+
12
14
 
13
15
  let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in
14
16
 
@@ -42,7 +44,7 @@
42
44
 
43
45
 
44
46
 
45
- guard let data = data, let jsonData = try? JSONDecoder().decode(Rubi.self, from: data) else {
47
+ guard let data = data, let jsonData = try? JSONDecoder().decode(API.self, from: data) else {
46
48
 
47
49
  print("json conversion failed")
48
50