C# Corps HTTP avec la méthode GET
Je suis en utilisant une API qui m'oblige à définir la méthode pour OBTENIR et comprennent un corps de message. Cependant, lorsque j'essaie de faire cela, j'obtiens l'erreur suivante: "Impossible d'envoyer un contenu-corps avec ce verbe-type". J'ai lu que la classe HttpWebRequest ne prend pas en charge ce et est la raison de l'exception. Est-il contourner?
C'est mon code actuel: les données est une chaîne json codé comme un tableau d'octets
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
request.ContentType = "application/json";
request.ContentLength = data.Length;
using (Stream requestStream = request.GetRequestStream()) {
requestStream.Write(data.ToArray(), 0, (int)data.Length);
}
C'est le code PHP je suis en essayant d'imiter
<?php
$data = array("id" => "1234");
$data_string = json_encode($data);
$ch = curl_init('url');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
var_dump($result);
?>
Merci,
Double Possible de Possible pour HttpClient pour envoyer un contenu ou à l'organisme pour OBTENIR une demande?
OriginalL'auteur Fernando | 2012-08-17
Vous devez vous connecter pour publier un commentaire.
Que fait-on appeler une API qui va activement contre le RESTE? "HÂTE"? "L'INQUIÉTUDE"?
Avec un peu de chance, ils le service n'est tout simplement pas attention à ce que le verbe est et le code PHP est juste arrivé d'utiliser GET et a frappé le bug que le serveur n'a pas de bloc, ce qui est un joli bug mineur tant qu'il se comporte correctement, et il ira bien avec la POSTE.
À défaut, votre meilleur pari est de voir si ils ont une méthode alternative qui soit (si c'est une lecture de la demande qui s'inscrit naturellement dans GET) accepte des paramètres de l'URI avec peut-être approprié les en-têtes utilisés conformément à la RFC 2616, ou d'autre peut accepter quelque chose par la POSTE, OBTENIR etc.
Si cela ne fonctionne pas, vous aurez à construire un client HTTP en haut de TcpClient. Ce qui serait assez horrible.
Eh bien, je ne me plaindrai jamais de les violations de REPOS que je dois mettre en place avec de nouveau. Non, c'est un mensonge et je vais toujours à se plaindre, mais quelque chose en insistant sur un corps qui est le pire que j'ai jamais vu. (Vous avez confirmé qu'il refuse de manipuler les mêmes données POST, oui?)
Oui, comme le POST est utilisée pour effectuer une mise à jour des entités, et il retourne uniquement un état de l'opération, et un message si l'opération échoue comme un objet JSON. Je vais essayer de convaincre les développeurs d'API pour modifier leur méthode GET, sinon je vais devoir créer un appel à l'aide de la TcpClient. Je vous remercie.
Je pense que l'affichage d'un corps dans une méthode GET est goofy aussi; malheureusement, je pense que certaines des avancées Elasticsearch 6.6 _search exemples actuellement passer d'un corps lors de l'utilisation d'une méthode GET. J'ai besoin d'émuler ces exemples dans ASP.NET. La HttpWebRequest n'est pas me laisser faire et je n'ai pas un accès facile à CURL: élastique.co/guide/fr/elasticsearch/de référence/de courant/...
J'ai testé HttpWebRequest, WebRequest, et HttpClient. Ils retournent tous à une exception si vous incluez un contenu corps dans une requête GET. C# n'est pas votre ami pour ce problème. Je ne sais pas comment votre système est construit. Est-il possible de déplacer votre demande d'api à un site web et d'utiliser javascript pour faire la demande? Javascript va vous permettre d'inclure un contenu corps dans une requête GET.
OriginalL'auteur Jon Hanna
Il est tout à fait possible, mais vous devez utiliser la nouvelle classe HttpClient: https://stackoverflow.com/a/47902348/70345
Merci de m'alertant ce - que j'ai posté la réponse d'un moment après, j'avais effectivement testé ce code, donc j'ai oublié que je n'étais capable de le faire fonctionner avec Core - j'ai modifié pour note ce.
Il n'y a rien dans la spécification HTTP, qui interdit explicitement l'envoi d'une demande avec un corps lors de l'utilisation d'un corps-moins verbe. Et il y a certainement des scénarios où, de l'OMI, ceci est donc valable: en particulier, si votre demande est très grande (trop grande pour encoder tous les paramètres dans l'URL) - Elasticsearch le fait, par exemple. Maintenant, vous pouvez dire "dans ce cas, l'utilisation POST" mais du point de vue sémantique (à partir d'un point de vue Reposante au moins), le POST est de mettre à jour une ressource tout en OBTENIR est de le récupérer. De toute façon - je ne veux pas entrer dans une sémantique religieuse et de la guerre dans les commentaires.
OBTENIR est documenté dans le HTTP spécification pour récupérer des informations qui "est identifié par l'URI de Demande", qui n'incluent pas de corps. Je comprends et je sais que beaucoup de services "abus" (à mon avis, pas besoin de répondre à ça) la demande d'OBTENIR et d'envoyer beaucoup de données, mais il est en fait pas dans la spécification. Évidemment, il peut être réalisé techniquement et j'ai vu beaucoup de services qui l'utilisent, mais il n'est pas conforme aux spécifications. Mais oui, pas besoin de créer un gros thread à ce sujet, il va finir comme une question d'opinion, de toute façon 🙂
C'est une recommandation de ne pas le faire, elle ne fait pas partie de la spécification. c'est pourquoi .net de base mis en œuvre, coz il y a un besoin et de la sémantique, il ne fait pas de sens d'envoyer des requêtes post pour récupérer des données. mono runtime n'est pas le cas, donc clairement c'est une question de préférence.
OriginalL'auteur Ian Kemp
Il n'est pas recommandé d'envoyer le contenu avec une requête GET. Voir ce post pour plus de détails: HTTP GET avec le corps de la requête
Et c'est ce que Roy Fielding a à dire sur le sujet.
Wow, demandez-leur de changer leur API. Il est tout simplement faux.
Euh, savez-vous c'est comment ElasticSearch est REST API travaille? L'envoi de requêtes complexes nécessite un corps de requête et d'une requête GET. Conceptuellement, c'est beaucoup de chemin RESTE fonctionne. Tout autre verbe serait faux, et vous ne pouvez pas toujours presser comples requêtes dans l'URL. Je suis surpris de l'objet HttpWebRequest ne peut pas gérer.
OriginalL'auteur Dennis Traub