Buduję aplikację, która wysyła informacje do interfejsu API. W dokumentacji API mówi, że prośba powinna być wysyłana w ten sposób:

curl -s -H "Content-Type: application/json" -H "Authorization: Bearer 84ec207ad0154a508f798e615a998ac1fd752926d00f955fb1df3e144cba44ab" \
  -XPOST \
  -d '{"external_sales_invoice":{"reference":"30052","contact_id":303632932854040464,"details_attributes":[{"description":"Rocking Chair","price":129.95}]}}' \
  https://moneybird.com/api/v2/123/external_sales_invoices
   

Powyższy przykład jest przeznaczony do Curl, BTW. Ale jak widać "Szczegóły_attribute" jest tablicą. Jak przetłumaczyć to na kod SWIFT? Próbowałem:

        let url = URL(string: "https://moneybird.com/api/v2/294775401414132869/external_sales_invoices")!
        var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
        components.queryItems = [
            URLQueryItem(name: "contact_id", value: "\(contactID)"),
            URLQueryItem(name: "details_attribute", value: "[{\"description\":\(description),\"price\":\(price)}]")
        ]

        let query = components.url!.query

        var request = URLRequest(url: url)
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        request.httpMethod = "POST"
        request.httpBody = Data(query!.utf8)

        URLSession.shared.dataTask(with: request) { (data, response, error) in
            if error != nil {
                print(error!)
                return
            }
            do {
                let json = try JSONSerialization.jsonObject(with: data!)
                print(json)
            } catch {
                print("error")
            }
            if let httpResponse = response as? HTTPURLResponse {
                print(httpResponse.statusCode, "invoice")
            }
        }.resume()
0
kai-353 27 październik 2020, 19:35

1 odpowiedź

Najlepsza odpowiedź

@ Odpowiedź LAME działa: Usunąłem moje UrlqueryItems i zastąpiłem ją:

let param: [String: Any] = ["external_sales_invoice": ["reference": "30052", "contact_id":303632932854040464, "details_attributes": [ ["description":"Rocking Chair","price": 129.95] ]]]

I

request.httpBody = try! JSONSerialization.data(withJSONObject: param, options: [])
0
kai-353 27 październik 2020, 21:34