I'm writing a program because I want to use Nature Remo's local API, but it doesn't work.
I wrote a program to send URL requests while referring to articles on the Internet.I was able to use the API on my Mac terminal, so I'm busy trying to use it as a swift.
You can use the API at the terminal by doing the following:
(AAAAA part is the device ID, XXX is a number)
I also tried ATS for http communication, but it didn't work.
The status code is 400 so I wonder if the content of the request is bad?
I'm almost a beginner who doesn't know right or left, so I'd appreciate it if someone could tell me.
commands executed:
curl-X POST 'http://AAAA/messages'-H'X-Requested-With: curl'-H' accept: application/json'-d' { "format": "us", "freq":BB, "data": [XXX,XXX, XXXX, XXXX, ... ]}'
Swift code:
import UIKit
classViewController:UIViewController {
override func viewDidLoad(){
super.viewDidLoad()
}
override funcdidReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
@IBOutlet weak var label: UILabel!
@ IBAction func button(_sender:Any){
// create the url-request
let url = URL (string: "http://XXXXXX/messages")!
var request = URLRequest(url:url)
// set the method
request.httpMethod="POST"
// add the header
request.setValue("X-Requested-With:curl", for HTTPHeaderField:"Expect")
request.setValue("accept:application/json", for HTTPHeaderField:"Content-Type")
// set the request-body(JSON)
let json:[String:Any] = [
"format":"us",
"freq":"38",
"data":[8918,4554,473,657,476,654,500,631,504,627,499,637,503,1739,530,590,481,1762,494,1741,499,1744,494,1738,509,614,522,1720,478,1762,500,639,469,1763,498,1738,471,655,478,661,506,1721,547,586,479,1765,470,1771,494,1738,472,665,466,1768,469,1767,553,574,476,1767,470,660,499,632,474,675,455,39790,553,199,329,192,204,189,174,226,171,227,184,205,251,198,170,195,174,197,171,199,147,196,194,199,171,198,197,171,168,252,189,233,161,208,172,200,170,192,200,197,170,200,169,2464,351
],
]
//add the "json" as a top level ovject's fact
request.httpBody = try? JSONSerialization.data(withJSONObject: json)
// use URLSessionDataTask
let session = URLSession.shared
session.dataTask(with: request) {(data, response, error) in
if error == nil, let data = data, let response = response as? HTTPURLResponse {
// HTTP (Hyper Text Transfer Protocol) header of an acquisition
print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")")
// the HTTP status codes
print("statusCode: \(response.statusCode)")
print(String(data:data, encoding:String.Encoding.utf8)???")
}
}.resume()
}
}
I'm not sure if it's directly related because it's not mentioned, but I think Apple's application requires a security setting of ATS
for http communication, only https://
communication is allowed, and http://
communication is not allowed.
Check the debug area for ATS
warnings when executing the source code.
To avoid this, the application's project file is located in Info.plist
to
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>AAAAAA/key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
I think it is necessary to write something like this, but do you have this setting?
Because this example may be incorrect, you must check ATS
http
Allow
to set the correct value.
айка さんThe comment to Mr./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms./Ms.
There is no Nature Remo in kind, so I can only say that it is a possibility considering the content of your questions and comments, but your Swift code now sends a header different from the one curl sends with API enabled, so please correct it first.
If you specify -H'X-Requested-With:curl'
in curl, the header field name is X-Requested-With
, and its value is curl
.
Therefore, the Swift code to send the header to match your curl command is as follows:
//add the header
request.setValue("curl", for HTTPHeaderField: "X-Requested-With")
request.setValue("application/json", for HTTPHeaderField: "accept")
I'm sorry that I can't say for sure because I can't try it on hand, but of course, I wonder if the ATS setting written by айка さん is correct or if http://AAAA/messages
and in Swift code are the same URL (
AAAA
and XXXXX>).
© 2024 OneMinuteCode. All rights reserved.