Survey Monkey дает мне недопустимую авторизацию в ошибке заголовка запроса

Я использую .NET HttpClient в формах xamarin, чтобы попытаться подключиться к обзорной обезьяне. Я новичок в HttpClient, Xamarin, REST и Survey Monkey, поэтому могу делать ошибки где угодно и где угодно.

У меня был некоторый успех, используя примеры обезьяны обзора с curl, и я пытаюсь преобразовать это в код C # с помощью HttpClient.

У меня есть "тестовый код" вроде

HttpClient httpClient = new HttpClient();
Uri        uri        = new Uri("https://api.surveymonkey.net/v2/surveys/get_survey_list?api_key=humkanu389g5dp9tvsdrh8fv");
HttpContent content = new StringContent(String.Empty,Encoding.UTF8,"application/json");

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization","Bearer XXXXXXXXX");
httpClient.Timeout = TimeSpan.FromSeconds(10);

HttpResponseMessage response = Task.Run(() => httpClient.PostAsync(uri,content)).Result;

String responseContent = Task.Run(() => response.Content.ReadAsStringAsync()).Result;

В моем коде я заменил XXXXXXX своим токеном авторизации.

Но я получаю ответ вроде

{"status":1,"errmsg":"Invalid \"Authorization\" data in request header"}

Мне интересно, неправильно ли я обрабатываю часть AuthenticationHeaderValue (). Или что-то другое?


person user2735420    schedule 12.10.2016    source источник


Ответы (2)


Ваш заголовок имеет неправильный формат, в качестве значения указано "Носитель авторизации XXXXX". Вот так это выглядит:

Authorization: Authorization bearer XXXXX

Я не уверен, почему, основываясь на вашем коде, вы должны отлаживать и видеть значение, которое вы отправляете. Но должно быть:

Authorization: bearer XXXXX

Я предполагаю, что AuthenticationHeaderValue делает то, чего вы не ожидаете. При поиске в документах кажется, что вы все делаете правильно - поэтому я не совсем уверен, что не так с кодом C #, просто заголовок, который вы отправляете, неверен.

person General Kandalaft    schedule 12.10.2016
comment
›› необходимо выполнить отладку и просмотреть отправляемое значение. - person user2735420; 12.10.2016
comment
›› необходимо выполнить отладку и просмотреть отправляемое значение. - person user2735420; 12.10.2016
comment
ладно, видимо, я не могу вставить разрыв строки в комментарий. Он публикует комментарий, когда я пытаюсь. Я пытался сказать, как? Я не знаю, как посмотреть, что я отправляю. Я раньше не делал REST и / или http. Благодарность - person user2735420; 12.10.2016
comment
Я думаю, вы на правильном пути. Я нашел аналогичный случай в stackoverflow.com/questions/14627399 / и я попробовал синтаксис httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue (Bearer, XXXXXXX); Теперь у меня другая ошибка, я думаю, не связанная с авторизацией. - person user2735420; 12.10.2016

Генерал Кандалафт действительно указал на проблему, которая, оглядываясь назад, была очевидна, но я хочу опубликовать здесь окончательный код на случай, если кто-то еще попытается это сделать.

В итоге я исправил AuthenticationHeaderValue, как указано выше. Затем я столкнулся с проблемой, потому что содержимое моего запроса было пустой строкой. Я вставил текст в формате json из примера, и это сработало. Итак, окончательный код

HttpClient httpClient = new HttpClient();
Uri        uri        = new Uri("https://api.surveymonkey.net/v2/surveys/get_survey_list?api_key=humkanu389g5dp9tvsdrh8fv");
HttpContent content = new StringContent ("{ \"fields\": [ \"title\", \"date_modified\" ] }",Encoding.UTF8,"application/json");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer","XXXXXX");
httpClient.Timeout = TimeSpan.FromSeconds(10);

HttpResponseMessage response = Task.Run(() => httpClient.PostAsync(uri,content)).Result;

String responseContent = Task.Run(() => response.Content.ReadAsStringAsync()).Result;
person user2735420    schedule 12.10.2016