Je me cogne la tête contre un mur pour tenter de convertir une commande curl fonctionnelle en une requête Web # C.
J'ai lu pas mal de messages et j'ai étais je suis presque sûr que j'avais le code correct, mais cela ne fonctionnera toujours pas.
Quelqu'un peut-il voir ce que je fais mal s'il vous plaît?
Voici la commande curl de travail:
curl -k -u x:reallylongstring -H "Content-Type: application/json" https://api.somewhere.com/desk/external_api/v1/customers.json
Et voici le code que j'ai écrit en c #:
WebRequest wrGETURL;
wrGETURL = WebRequest.Create("https://api.somewhere.com/desk/external_api/v1/customers.json");
wrGETURL.Method = "GET";
wrGETURL.ContentType = "application/json";
wrGETURL.Credentials = new NetworkCredential("x", "reallylongstring");
Stream objStream = wrGETURL.GetResponse().GetResponseStream();
StreamReader objReader = new StreamReader(objStream);
string responseFromServer = objReader.ReadToEnd();
Mais l'api répond:
The remote server returned an error: (406) Not Acceptable.
Toute aide serait très appréciée!
Merci
D'après les indications de Nikolaos, il semble que j'ai corrigé le problème avec le code suivant:
public static gta_allCustomersResponse gta_AllCustomers()
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.somewhere.com/desk/external_api/v1/customers.json");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Accept = "*/*";
httpWebRequest.Method = "GET";
httpWebRequest.Headers.Add("Authorization", "Basic reallylongstring");
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
gta_allCustomersResponse answer = JsonConvert.DeserializeObject<gta_allCustomersResponse>(streamReader.ReadToEnd());
return answer;
}
}
Voici la commande curl que j'utilise pour publier des données JSON:
curl http://IP:PORT/my/path/to/endpoint -H 'Content-type:application/json' -d '[{...json data...}]'
Ceci est équivalent à la commande curl ci-dessus avec C #:
var url = "http://IP:PORT/my/path/to/endpoint";
var jsonData = "[{...json data...}]";
using (var client = new WebClient())
{
client.Headers.Add("content-type", "application/json");
var response = client.UploadString(url, jsonData);
}
Voici ma solution pour publier des données JSON en utilisant un appel API ou un service Web.
public static void PostJsonDataToApi(string jsonData)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.somewhere.com/v2/cases");
httpWebRequest.ReadWriteTimeout = 100000; //this can cause issues which is why we are manually setting this
httpWebRequest.ContentType = "application/json";
httpWebRequest.Accept = "*/*";
httpWebRequest.Method = "POST";
httpWebRequest.Headers.Add("Authorization", "Basic ThisShouldbeBase64String"); // "Basic 4dfsdfsfs4sf5ssfsdfs=="
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
// we want to remove new line characters otherwise it will return an error
jsonData= thePostBody.Replace("\n", "");
jsonData= thePostBody.Replace("\r", "");
streamWriter.Write(jsonData);
streamWriter.Flush();
streamWriter.Close();
}
try
{
HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
string respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd();
Console.WriteLine("Response : " + respStr); // if you want see the output
}
catch(Exception ex)
{
//process exception here
}
}
Selon cette question concernant 406: Qu'est-ce que "406-Not Acceptable Response" dans HTTP? Peut-être pourriez-vous essayer d’ajouter un en-tête Accept à votre demande? Peut-être que curl ajoute cela automatiquement.
De plus, il y a un -k dans votre requête curl lui disant d'ignorer la validation SSL, ce qui ne permet pas de savoir si cela affecte le code .NET. En d'autres termes, curl fonctionne-t-il toujours sans le '-k'? Alors, pas de soucis. Sinon, vous devrez peut-être indiquer à .NET d’ignorer également la validation SSL.