Отправка запроса от ios интерпретируется как GET на сервере - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над приложением 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.

Надеюсь, я смогу лучше понять проблему здесь.

1 Ответ

0 голосов
/ 06 мая 2020

Похоже, что это не ошибка метода HTTP в предоставленном вами коде. Вы можете проверить фактический http-запрос, если запустите приложение на симуляторе и используете Charles или WireShark для отслеживания запроса. Или на устройстве с помощью Charles или других прокси. Вы должны увидеть что-то вроде этого:

    POST /user/stateslist.php HTTP/1.1
Host    localhost:8080
Content-Type    application/json
Accept  application/json
User-Agent  MyPlayground123456789/1 CFNetwork/1125.2 Darwin/19.4.0
Content-Length  19
Accept-Language en-us
Accept-Encoding gzip, deflate
Connection  keep-alive
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...