Maison  >  Questions et réponses  >  le corps du texte

Quelle est la fonction équivalente en PHP qui implémente la fonctionnalité « request.post » en Python ?

J'ai besoin d'aide pour traduire le code Python en PHP. C'est ainsi que le script est configuré pour communiquer avec le serveur API, en utilisant la connexion POST dans cette partie du code.

Le code Python a été testé et fonctionne, mais je n'arrive pas à comprendre exactement de quelle manière je dois le convertir en PHP car je reçois une réponse vide de l'API, ce qui signifie - Erreur. Je soupçonne d'utiliser de mauvais paramètres de publication ou une mauvaise méthode de publication.

Dans le code python, il y a un commentaire expliquant à quoi devrait ressembler un retour API réussi.

Éditeur : var_dump($result); renvoie bool(false) et lorsque le rapport d'erreurs est activé, cet avertissement apparaîtra : 警告:file_get_contents(https://kodi.titlvi.com/api/subtitles/gettoken):无法打开流:HTTP请求失败! HTTP/1.1 404 Not Found in /var/www/html/test.php on line 19 bool(false)

PHP - script actuel

<?php
    error_reporting(-1);
    ini_set('display_errors', 1);

    $api_url = "https://kodi.titlovi.com/api/subtitles";

    $username = "censored";
    $password = "censored";

    // sending user login request
    $parameters = array('username' => $username, 'password' => $password, 'json' => true);
    $options = array('http' => array(
        'header'  => 'Content-Type: application/x-www-form-urlencoded\r\n',
        'method'  => 'POST',
        'content' => http_build_query($parameters)
    ));
    $context  = stream_context_create($options);
    $result = file_get_contents($api_url.'/gettoken', false, $context);

    var_dump($result);
?>

Python (exemple fonctionnel)

api_url = 'https://kodi.titlovi.com/api/subtitles'
  def handle_login(self):
        """
        Method used for sending user login request.

        OK return:
            {
                "ExpirationDate": datetime string (format: '%Y-%m-%dT%H:%M:%S.%f'),
                "Token": string,
                "UserId": integer,
                "UserName": string
            }

        Error return: None
        """
        logger('starting user login')
        login_params = dict(username=self.username, password=self.password, json=True)
        try:
            response = requests.post('{0}/gettoken'.format(api_url), params=login_params)
            logger('Response status: {0}'.format(response.status_code))
            if response.status_code == requests.codes.ok:
                resp_json = response.json()
                logger('login response data: {0}'.format(resp_json))
                return resp_json
            elif response.status_code == requests.codes.unauthorized:
                show_notification(get_string(32006))
                return None
            else:
                return None
        except Exception as e:
            logger(e)
            return None

P粉495955986P粉495955986178 Il y a quelques jours303

répondre à tous(1)je répondrai

  • P粉281089485

    P粉2810894852024-03-29 13:13:59

    param=dictionary Mettez les paramètres dans les paramètres de requête d'URL au lieu des données POST.

    Le serveur nécessite l'en-tête Content-length:, que PHP n'envoie pas par défaut.

    Pour inclure rn dans l'en-tête, vous devez utiliser des guillemets doubles et non des guillemets simples.

     $username, 'password' => $password, 'json' => True);
        $options = array('http' => array(
            'header'  => "Content-Length: 0\r\n",
            'method'  => 'POST',
        ));
        $context  = stream_context_create($options);
        $result = file_get_contents($api_url.'/gettoken?' . http_build_query($parameters), false, $context);
    
        var_dump($result);
    ?>

    répondre
    0
  • Annulerrépondre