go - AFNetworking 和授权 header

标签 go afnetworking-2

我是 AFNetworking 的新手,我正在尝试使用它与我用 Go 编写的 API 对话。我很难让 Authorization header 正常工作。我将 AFHTTPSessionManager 子类化并按如下方式配置它

+ (HMAPIClient *)sharedHMAPIClient
{
    static HMAPIClient* _sharedHMAPIClient = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedHMAPIClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:HMBaseURL]];
    });

    return _sharedHMAPIClient;
}

- (instancetype)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];

    if (self) {
        self.responseSerializer = [AFJSONResponseSerializer serializer];
        self.requestSerializer = [AFJSONRequestSerializer serializer];

        [self.requestSerializer setAuthorizationHeaderFieldWithUsername:RegistrationAPIKey
                                                               password:@"Doesn't matter what goes here."];
    }

    return self;
}

- (void)hitTestEndpoint
{
    [self GET:@"testEndpoint" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"%@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@", error);
    }];
}

当我调用 -(void)hitTestEndpoint 时,我在服务器日志中看到以下 header (缺少授权):

Key: Accept-Encoding Value: [gzip, deflate]
Key: Connection Value: [keep-alive]
Key: Accept-Language Value: [en;q=1]
Key: User-Agent Value: [TestApp/2 (iPad Simulator; iOS 8.1; Scale/2.00)]
Key: Accept Value: [*/*]

为了比较,当我使用以下 curl 命令访问相同的端点时,

curl https://api.example.com/v1/testEndpoint/ -u test_xqzwjcasogptbnpa:

我看到以下标题:

Key: Authorization Value: [Basic eHF6d2pjYXNvZ3B0Ym5wYTo=]
Key: User-Agent Value: [curl/7.30.0]
Key: Accept Value: [*/*]

有人能指出我正确的方向吗? -谢谢

更新: 我添加了 AFNetworkActivityLogger 以便我可以看到每个请求。 Authorization header 确实包含在内。另外,我试着打 http://headers.jsontest.com ,它返回从客户端收到的 HTTP 请求 header 。授权 header 出现在该输出中。

所以,问题一定出在我的服务器上。我已经记录了每个请求的所有 header ,但我不确定还能去哪里查看。打算用 Go 标记这个问题,看看是否有人有想法。

更新 2: 我在请求处理程序的顶部添加了对 httputil.DumpRequest 的调用,它还显示缺少 Authorization header 。顺便说一句,我设置的任何自定义 header 都按预期显示。只是缺少授权 header 。

这是 Go 代码:

func testResponse(rw http.ResponseWriter, request *http.Request) {

    // check output from DumpRequest()
    dump,err := httputil.DumpRequest(request,true)
    check(err)
    fmt.Println("Output of DumpRequest():")
    fmt.Println(string(dump))
    fmt.Println("============")

    fmt.Println("request.Headers:")
    for key, value := range request.Header {
        fmt.Println("Key:", key, "Value:", value)
    }
    fmt.Println("===============")

    // return some dummy JSON
    rw.Header().Set("Content-Type", "application/json")
    rw.Write(PersonToJson(getPerson("2f6251b8-d7c4-400f-a91f-51e09b8bfaf4")))

最佳答案

您显示的服务器日志看起来像 Go 已经解析过的标题。查看 Go 收到的原始纯文本 HTTP header 会很有帮助。这会告诉您 Go 是否忽略了 header ,或者是否有上游的东西将其剥离。

编辑:不确定为什么 Go 会在给您所谓的原始请求之前删除 Authorization header 。但我认为 Authorization header 通常仅在发出先前未经授权的请求并从服务器获得带有 WWW-Authenticate header 的 401 响应后才由客户端发送。由于听起来您的客户端突然发送了 Authorization header ,可能是 Go 服务器 API 忽略并剥离了 header ,因为它从未要求客户端发送它。

如果您只想在每个请求上发送一个简单的身份验证 token ,如果您只是简单地使用一个虚构的 X- header ,因为您表示您设置的其他 header 可以正常到达,那会怎么样?

关于go - AFNetworking 和授权 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548499/

相关文章:

go - 声明后如何给空 slice 赋值

date - 在 GoLang 中使用 GMT+2 获取当前时间

rest - 在 golang 中使用全局变量

ios - 零 sockaddr_in 在 SCNetworkReachabilityCreateWithAddress 中意味着什么?

ios - 如何使用AFHTTPSessionManager记录每个请求/响应?

ios - 在 AFNetworking 中设置用户代理

docker - 无法在 docker 容器内执行二进制文件,而是从主机执行

docker - 无法让 dep 和 dockerize 在 docker-compose 中一起工作(但它们是分开工作的)。为什么?

ios - AFNetworking 在 404 Bad Request 仍然获得 JSON 响应后获得 JSON

ios - 使用activityIndi​​cator作为图像占位符