【问题标题】:Getting 404 error when request is made through Alamofire in swift3在 swift3 中通过 Alamofire 发出请求时出现 404 错误
【发布时间】:2017-09-14 16:23:28
【问题描述】:

首先,我们使用下面的代码,因此 api 仅适用于移动设备,而不适用于浏览器。 "

$iPod = stripos($_SERVER['HTTP_USER_AGENT'], "iPod");
    $iPhone = stripos($_SERVER['HTTP_USER_AGENT'], "iPhone");
    $iPad = stripos($_SERVER['HTTP_USER_AGENT'], "iPad");
    $Android = stripos($_SERVER['HTTP_USER_AGENT'], "Android");

$json_data = json_decode(file_get_contents('php://input'));
if ($json_data) {
    $username_1 = $json_data->username;
    if ($Android || $iPad || $iPhone || $iPod) {}

其次,api 正在 android(使用 volley)和 ios objective-c 中使用 AFNetworking。但是,现在我将项目移植到 swift3 并且我正在使用“Alamofire”进行网络调用。

方法::(这是我发出 POST 请求的方式):

let headers : HTTPHeaders = [
            "Accept" : "application/json"
        ]

Alamofire.request("API URL", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
            .responseJSON{
                response in
                if let json = response.result.value{
                }

但是,我收到错误 404,我们通常在浏览器中点击 api 时会遇到此错误。 之后,我删除了该后端检查,请求运行良好并得到了正确的响应。但是,我们无法删除该检查。所以请帮助我,如果我在其他内容的标题上犯了任何错误。

这就是我在 debugPrint(response)::

中得到的
{ status code: 200, headers {
    "Access-Control-Allow-Origin" = "*";
    "Cache-Control" = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
    Connection = "Keep-Alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 84;
    "Content-Type" = "text/html; charset=UTF-8";
    Date = "Thu, 14 Sep 2017 17:03:17 GMT";
    Expires = "Thu, 19 Nov 1981 08:52:00 GMT";
    "Keep-Alive" = "timeout=5";
    Pragma = "no-cache";
    Server = "Apache/2.4.25";
    Vary = "Accept-Encoding,User-Agent";
    "X-Powered-By" = "PHP/5.6.31";
} }
[Data]: 80 bytes
[Result]: SUCCESS: {
    "is_valid" = 0;
    status = 404;
    "status_message" = "access denied";
    success = 0;
}

【问题讨论】:

  • 您确定 User-Agent 包含 iPod、iPhone 或 iPad?阅读它似乎发送的内容:github.com/Alamofire/Alamofire/blob/master/…。此外,由于您似乎可以控制服务器,因此作为调试,您可以检查用户代理。

标签: ios swift alamofire


【解决方案1】:

Alomafire 发送默认标头参数 User-Agent 好吧,但它的值类似于 iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0

这是来自他们的自述文件:

您显然可以提供自己的自定义标头:

let headers: HTTPHeaders = [
  "User-Agent": "iPhone",
  "Accept": "application/json"
]

Alamofire.request("<Ypur URL>", headers: headers)
  .responseJSON { response in
  debugPrint(response)
}

或者如果你想保留其他默认的标头参数

var headers = Alamofire.SessionManager.defaultHTTPHeaders
headers["User-Agent"] = "iPhone"

【讨论】:

  • @karticchaudhary:你能用 charles 看看当你从 Android 代码和你的 iOS 代码拨打电话时会发送什么吗?
  • @PuneetSharma 我没有检查 Alamofire,但如果它使用 NSURLSessionNSURLSessionConfigurationconfiguration 是“复制”。正如 Alamofire 所建议的,“如果您需要自定义这些标头,则应创建自定义 URLSessionConfiguration,更新 defaultHTTPHeaders 属性并将配置应用于新的 SessionManager 实例。”创建一个 URLSessionConfiguration 并将其设置为 URLSession。另外,如果作者可以控制服务器,让服务器搜索“iOS”而不是“iPhone”,就像搜索“Android”一样。不同的选择很奇怪。
猜你喜欢
  • 2013-08-25
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2019-02-22
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多