Я работаю над приложением iOS, и с сегодняшнего дня оно работает нормально.
Сегодня мое приложение начало не показывать данные, и когда я проверил, я обнаружил, что когда я отправляю запрос в сервер для данных, он говорит, что мой запрос является запросом на получение. На сервере у меня есть проверка, которая разрешает только почтовый запрос. Вот код для этого:
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
// throw new Exception('Request method must be POST!');
echo json_encode(["status"=> "0", "message"=> "Request must be post request", "Server Var" => $_SERVER], JSON_PRETTY_PRINT);
die();
}
Из приложения iOS я отправляю почтовый запрос. Вот код для этого:
let param = state ? "\(BASE_URL)user/stateslist.php": "\(BASE_URL)user/countieslist.php"
let dic = ["apikey": APIKEY]
let session = URLSession.shared
let url = URL(string: param)
var request = URLRequest(url: url!)
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
do {
let json = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body
request.httpBody = json
} catch let error {
print(error.localizedDescription)
}
request.httpMethod = "POST"
let tache = session.dataTask(with: request) { (data, response, error) -> Void in
print(response)
if let antwort = response as? HTTPURLResponse {
let code = antwort.statusCode
print("Code is \(code)")
guard error == nil else {
completion(error, nil)
return
}
guard let data = data else {
completion(error, nil)
return
}
var counties = [StateCounty]()
do {
//create json object from data
if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
print(json)
if let data = json["data"] as? NSArray{
for user in data{
if let item = user as? NSDictionary{
let user = StateCounty(dic: item)
counties.append(user)
}
}
completion(nil, counties)
}
else{
completion(nil, nil)
}
}
else{
completion(nil, nil)
}
} catch let error {
completion(error, nil)
print(error.localizedDescription)
}
}
}
print("HTTP METHOD \(tache.currentRequest?.httpMethod)")//this says post
tache.resume()
Но это результат, который я получаю от API. Приведенный выше код выполняется для PHP, и это результат:
["message": Request must be post request, "status": 0, "Server Var": {
"DOCUMENT_ROOT" = "/home/u562977278/domains/domain/public_html";
HTTPS = on;
"HTTP_ACCEPT" = "application/json";
"HTTP_ACCEPT_ENCODING" = "gzip, deflate";
"HTTP_ACCEPT_LANGUAGE" = "en-us";
"HTTP_HOST" = "host";
"HTTP_USER_AGENT" = "Gotyour6/1.2.6 CFNetwork/1107.1 Darwin/19.0.0";
"LSPHP_ProcessGroup" = on;
PATH = "/usr/local/bin:/bin:/usr/bin";
"PHP_SELF" = "/gotyour6/user/countieslist.php";
"QUERY_STRING" = "";
"REMOTE_ADDR" = "103.255.5.84";
"REMOTE_PORT" = 7083;
"REQUEST_METHOD" = GET;
"REQUEST_SCHEME" = https;
"REQUEST_TIME" = 1588750834;
"REQUEST_TIME_FLOAT" = "1588750834.773307";
"REQUEST_URI" = "/foldername/user/countieslist.php";
"SCRIPT_FILENAME" = "/home/u562977278/domains/domainname/public_html/gotyour6/user/countieslist.php";
"SCRIPT_NAME" = "/gotyour6/user/countieslist.php";
"SCRIPT_URI" = "https://domainname/gotyour6/user/countieslist.php";
"SCRIPT_URL" = "/gotyour6/user/countieslist.php";
"SERVER_ADDR" = "46.17.175.194";
"SERVER_ADMIN" = "";
"SERVER_NAME" = "servername";
"SERVER_PORT" = 443;
"SERVER_PROTOCOL" = "HTTP/1.1";
"SERVER_SOFTWARE" = LiteSpeed;
"SSL_CIPHER" = "TLS_AES_128_GCM_SHA256";
"SSL_CIPHER_ALGKEYSIZE" = 128;
"SSL_CIPHER_USEKEYSIZE" = 128;
"SSL_PROTOCOL" = "TLSv1.3";
"X-LSCACHE" = on;
"X_SPDY" = HTTP2;
}]
Я не уверен, проблема ли это на стороне клиента или на стороне сервера. Но при дальнейшей отладке с помощью Postman я обнаружил, что он работает с Postman, а не с iOS. Тот же запрос дает ожидаемые результаты и обрабатывает запрос как запрос POST, но не тот же случай с iOS.
Надеюсь, я смогу лучше понять проблему здесь.