【问题标题】:Post request to api works for Android but not for IOS. Xamarin对 api 的发布请求适用于 Android,但不适用于 IOS。赛马林
【发布时间】:2019-07-01 17:50:06
【问题描述】:

我一直在尝试创建一个验证我的令牌的函数,它适用于 Android,但不适用于 IOS。我的自定义 API 对 IOS 的响应返回未经授权的 401(当您发送无效密钥时应该这样做),但我已经在邮递员中尝试过该密钥并且它是有效的。

也许这与格式有关?但我看不出安卓和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发送时在标头中但不在Authorization标头中,您如何解决这个问题?

【问题讨论】:

  • 如果你控制了服务器,你需要比较Android和iOS的请求来判断有什么区别
  • 您是否使用 http 我们的 https 请求顺便说一句?
  • @BrunoCaceiro https
  • 你是什么意思-令牌在标头中但不在授权标头中?
  • @shanranm 当我调用 $headers = apache_request_headers();令牌在那里,但不在我正在寻找的 $headers['Authorization'] 中。

标签: c# ios xamarin xamarin.forms xamarin.ios


【解决方案1】:

我通过下载 Flurl 和 Flurl.Http 插件解决了这个问题并添加了这一行:

 var result = await url.WithOAuthBearerToken(token).PostJsonAsync(jsonstring);

信用:Xamarin forms not sending Authorization header

还有

Fluent HTTP

【讨论】:

  • 这只是一个解决问题的方法,引入一个完整的包(这首先是不必要的)只是为了“解决”它不是一个解决方案。请尝试调试它发生的原因。对您来说,是否也使用斜杠进行重定向?如果是这样,您可以在请求网址中添加斜杠并尝试吗?
  • @shanranm 我已经尝试使用斜杠,但问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 2021-10-06
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多