URLRequest Error "The given data was not valid JSON."



尝试使用标头和参数发出POST请求

可编码代码:

struct WelcomeMessage: Codable {
let receivedMessages: [ReceivedMessage]
}
// MARK: - ReceivedMessage
struct ReceivedMessage: Codable, Identifiable  {
let ackID: String
let message: Message
let id = UUID()
enum CodingKeys: String, CodingKey {
case ackID
case message
}
}
// MARK: - Message
struct Message: Codable {
let data, messageID, publishTime: String
enum CodingKeys: String, CodingKey {
case data
case messageID
case publishTime
}
}

服务代码:

class GetMessages: ObservableObject {
private var project_id: String = "redacted"
private var project_name: String = "redacted"

@Published var messages = [ReceivedMessage]()
func getMessages() {
guard let url = URL(string: "https://pubsub.googleapis.com/v1/projects(project_id)/subscriptions(project_name):pull") else {return}

var request = URLRequest(url: url)
let parameters : [String:Any] = [
"returnImmediately": false,
"maxMessages": 10]

request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer ya29.redacted", forHTTPHeaderField: "Authorization")

do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
print(error.localizedDescription)
return
}

URLSession.shared.dataTask(with: request) { (data, response, error) in
guard error == nil else {print(error!.localizedDescription); return }
// guard let data = data else {print("empty data"); return }
let theData = try! JSONDecoder().decode(WelcomeMessage.self, from: data!)
print(theData)
DispatchQueue.main.async {
self.messages = theData.receivedMessages
}

}
.resume()
}
}

对请求的响应应该返回一些JSON数据,看起来像:

{
"receivedMessages": [
{
"ackId": "UdfdsfdsfdsfdsfdgfhgfjJHGkjkjhKgjhgjFhgfDFgfdgDFGDFdfgFDGfd",
"message": {
"data": "//BASE-64 ENCODED STRING HERE",
"messageId": "4130086024457484",
"publishTime": "2022-02-16T15:03:49.372Z"
}
}
]
}

上面的错误消息,不确定为什么它说数据不是有效的JSON?

其他有意见的问题。。。我应该使用AlamoFire吗?

如果您显示的json响应是正确的,那么在ReceivedMessage中将ackID更改为ackId(注意小的"d"(,或使用

enum CodingKeys: String, CodingKey {
case ackID = "ackId"
case message
}

类似于Message中的messageID

相关内容

最新更新