Je voudrais télécharger un fichier en utilisant PUT sur TIdHtttp. J'ai trouvé une réponse de Remy Lebeau disant de ne pas utiliser PUT, mais d'utiliser POST à la place.Utilisez PUT pour télécharger un fichier avec TIdHTTP
Mais, dans mon cas, je ne peux pas le faire parce que j'utilise une troisième API, et il précise que j'ai besoin d'utiliser PUT. Si j'essaie d'utiliser POST, il me renvoie un message disant que la méthode n'est pas autorisée.
Fondamentalement, je suis en train de faire quelque chose comme ceci:
Response := TStringStream.Create;
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream');
FHttpComunication.Request.ContentType := 'multipart/form-data';
FHttpComunication.Put(UrlCmd, DS, Response);
Mais quand je le fais, je reçois un 500 - Internal server error
.
Si je retire le:
FHttpComunication.Request.ContentType := 'multipart/form-data';
Je reçois 400 - Bad Request
.
J'ai déjà essayé de faire la demande directement depuis le navigateur (client REST avancé - chrome) et cela fonctionne. Donc, l'API fonctionne. L'en-tête du message quand il fonctionne est:
PUT /api/2/project/XXXXXXXX/resource/export1po/translation/en/ HTTP/1.1 HOST: www.XXXXXXXXXXXXX.com authorization: Basic XXXXXXXXXXXXX content-type: multipart/form-data; boundary=----WebKitFormBoundaryPWT8bUdkQ1ZVLHdL accept: application/json accept-encoding: gzip, deflate accept-language: en-US,en;q=0.8 user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 content-length: 1936 ------WebKitFormBoundaryPWT8bUdkQ1ZVLHdL Content-Disposition: form-data; name="fileUpload2"; filename="teste.po" Content-Type: application/octet-stream
Le code est pas là, mais oui, je configuré les informations d'autorisation, il travaille, je peux vérifier cela parce que je peux utiliser d'autres appellent à l'API.
Mise à jour
Ceci est l'API que je suis en train d'utiliser PUT
: http://docs.transifex.com/api/translations/#put
façons que j'essayées:
1) Celui-ci retour 500 - Internal Server Error
. Je l'ai essayé en créant l'objet DS avec le type de contenu application/octet-stream
aussi. Mais j'ai eu la même erreur.
Response := TStringStream.Create;
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'multipart/form-data');
try
FHttpComunication.Request.ContentType := 'multipart/form-data';
FHttpComunication.Put(UrlCmd, DS, Response);
Result := Response.DataString;
finally
Response.Free;
DS.Free;
end;
2) La façon dont cela a été suggéré sur les réponses, mais cela ne fonctionne pas. J'ai eu l'erreur 500
aussi.
PutData := TFileStream.Create('C:\Users\r.rezino\Desktop\teste.po', fmOpenRead or fmShareDenyWrite);
Response := TStringStream.Create;
try
FHttpComunication.Request.ContentType := 'multipart/form-data'; //I tried with and without it
FHttpComunication.Put(UrlCmd, PutData, Response);
Result := Response.DataString;
finally
Response.Free;
PutData.Free;
end;
Fournir le code complet avec tous les en-têtes que vous définissez. Le dernier paramètre de la procédure 'AddFile' devrait être' application/octet-stream'. Ne définissez pas 'ContentType' manuellement si vous n'utilisez pas' TIdMultiPartFormDataStream'. Sinon, utilisez la fonction 'RequestContentType' comme je l'ai mentionné. Enregistrez vos en-têtes à partir de TIdHTTP.Request.RawHeaders.Text' ou utilisez l'événement 'OnIdHTTPHeadersAvailable' et comparez vos en-têtes. Si vous envoyez exactement la même requête, cela doit fonctionner. – smooty86