J'essaie d'accéder à un fichier update.txt sur mon site Web, à l'aide d'un programme compilé DELPHIXE et du composant IDHTTP.
Le code que j'utilise est comme suit: P>
HandleRedirects := true; HTTPOptions [hoForceEncodeParams]; ProtocolVersion := pv1_1; Request.UserAgent := Mozilla/5.0 (compatible; Test)
3 Réponses :
403 signifie que vous n'avez pas la permission d'accéder à l'URL demandée. Le serveur nécessite probablement de fournir un nom d'utilisateur / mot de passe, d'autant plus que vous utilisez un fichier .htaccess. Utilisez le BTW, votre request.Asername code> et request.password code> propriétés pour cela. Quant à la raison pour laquelle le navigateur ne demande pas de nom d'utilisateur / mot de passe, je suppose que le navigateur les a mis en cache d'un accès antérieur. P>
SpeedButtonUpdateclick () code> a une fuite de mémoire. Vous créez un nouvel objet TIDHTTP code> mais vous ne le libérez pas. P>
Bonjour Remy, je n'ai aucun nom d'utilisateur ou mot de passe mis en place pour le site. Je peux accéder à l'URL d'un WebBrowser sur un autre PC, cela ne m'appartient pas. THX pour la fuite de mémoire .. Juste exemple de code, mais vous êtes correct, il doit être libéré.
Ensuite, utilisez un sniffer de paquet, tel que WireShark, pour voir quelles demandes HTTP ressemblent à votre navigateur et à Tidhttp, puis à les comparer à des différences. Vêve, peut-être que votre serveur n'aime pas la valeur de la requête .useragent code> que vous utilisez. Certains serveurs sont sensibles à l'utilisateur.
J'étais inquiet pour la demande.useragent aussi et j'ai essayé de nombreuses variantes, sans aucun succès.
Bonjour Remy, en fait, le problème mie avec moi. Comme vous pouvez le constater dans le code, je crée Tidhttp, mais je ne changeais pas sa demande.useragent, mais le composant IDHTTP1 que j'avais abandonné sur la forme, donc la valeur par défaut Mozilla / 3.0 (compatible; bibliothèque indy) a été envoyée, Et pas ce que je pensais être envoyé tout le long. Donc, toutes les modifications que je faisais dans le composant.Properties et les tests ne traversaient jamais. Ajouter cette ligne de code l'a fait après la création du LidHTTP: lidhttp.request.useragent: = 'Mozilla / 5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; MAAU)'; Thx adrian
@Remy Lebeau - Teamb, 403 est interdit, 401 est pour un défi de compétence.
401 est utilisé pour demander des informations d'identification dans un format particulier spécifié par "l'authentification www". 403 est utilisé lorsque la demande est rejetée, comme si les informations d'identification appropriées ont été spécifiées mais non valables pour la ressource demandée.
Lorsque vous utilisez la fonction Get () d'Indy - Si vous définissez la propriété userAgent, comme indiqué dans Suivi Réponse, la demande aura les informations d'identification correctes et ne recevra pas une erreur 403.
Modification de la requête .UserAgent CODE> n'affecte pas la manière dont Indy envoie des informations d'identification de quelque manière que ce soit, il n'affecte que les demandes de processus certains i> HTTP.
FYI, I Il y a quelques minutes il y a quelques minutes enregistré dans une mise à jour où le fidhttp.request.useragent code> est maintenant personnalisable. Il existe un nouveau giddefaulTuseragent code> de variable globale dans le iDhttheaderinfo.pas code> unité. Au lieu de définir fidhttp.request.useragent code> séparément pour chaque Tidhttp code> objet utilisé, vous pouvez maintenant définir giddefaulTuseragent code> une fois au démarrage du programme et chaque TIDHTTP CODE> DEMANDE L'utilisera (vous pouvez toujours utiliser fidhttp.request.useragent code> pour remplacer le userAgent code> sur une base de requête, si nécessaire).
Je rencontre exactement le même problème lorsque vous utilisez la fonction Get () d'Indy ().
Il est plus que probable que vous obteniez cette erreur, car vous n'avez pas défini la propriété userAgent et le site Web sachant que vous n'acceptez pas le Fichier en tant que navigateur Bouchez une bagarre. P>
function CheckUpdates: String;
var lIdHttp: TIdHTTP;
begin
lIdHttp := TIdHTTP.Create(nil);
//avoid getting '403 Forbidden' by setting UserAgent
lIdHttp.Request.UserAgent :=
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
result := lIdHttp.Get('http://www.test.com/test_down_load/update.txt');
end;
Les réponses données n'ont pas fonctionné pour moi avant de les mettre tous ensemble.
//add Request.Username and supply the correct mysql username tidHttpObject.Request.Username := 'username'; //do the same for the password tidHttpObject.Request.Password := 'password'; //then add a UserAgent property with the string below tidHttpObject.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'; //finally call the get() url method of the tidHttp object Result := tidHttpObject.Get(url);