Я пытался создать функцию, которая проверяет мой токен, и она работает для Android, но не для IOS. Ответ на IOS от моего пользовательского API возвращает 401 неавторизованный (что и должно быть, когда вы отправляете недопустимый ключ), но я попробовал ключ в почтальоне, и он действителен.
Может быть, это как-то связано с форматированием? Но я не вижу, в чем будет разница между Android и IOS.
Некоторый код:
public async Task<T> PostResponse<T>(string weburl, string jsonstring) where T : class
{
var Token = App.TokenDatabase.GetToken();
string ContentType = "application/json";
var token = string.Format("Token token = {0}", Token.access_token);
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
try
{
var result = await client.PostAsync(weburl, new StringContent(jsonstring, Encoding.UTF8, ContentType));
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
var JsonResult = result.Content.ReadAsStringAsync().Result;
try
{
var ContentResp = JsonConvert.DeserializeObject<T>(JsonResult);
return ContentResp;
}
catch { return null; }
}
}
catch { return null; }
return null;
}
Я создал несколько журналов на стороне сервера, и когда я запускаю приложение IOS, токен по какой-то причине не передается на сервер.
PHP-код:
$token = null;
$headers = apache_request_headers();
if (isset($headers['Authorization'])){
$matches = array();
preg_match('/Token token=(.*)/', $headers['Authorization'], $matches);
if (isset($matches[1])){
$token = $matches[1];
}
}
file_put_contents('../config/log.txt', $token);
Я проверил, что приложение отправляет токен. Он исчезает где-то по дороге.
Обновлено: После некоторой регистрации я обнаружил, что токен находится в заголовке, но не в заголовке авторизации при отправке через IOS, как вы решаете это?
Кстати, вы используете http наши HTTPS-запросы?
@BrunoCaceiro https
Что вы подразумеваете под токеном в заголовке, но не в заголовке авторизации?
@shanranm Когда я вызываю $headers = apache_request_headers(); токен есть, но не в $headers['Authorization'], где я ищу.





Я решил это, загрузив плагины Flurl и Flurl.Http и добавив эту строку:
var result = await url.WithOAuthBearerToken(token).PostJsonAsync(jsonstring);
Кредит: Формы Xamarin не отправляют заголовок авторизации
Также
Это просто обходной путь для проблемы, привлечение целого пакета (который в первую очередь не нужен) только для «решения», это не решение. Пожалуйста, попробуйте отладить, почему это происходит. Для вас это тоже перенаправление с косой чертой в конце? если да, можете ли вы добавить косую черту в URL-адресе запроса и попробовать?
@shanranm Я пробовал с косой чертой в конце, и проблема не устранена.
если вы управляете сервером, вам нужно сравнить запросы с Android и iOS, чтобы определить, в чем разница