AFNetworking和授权标题

时间:2014-10-24 13:06:19

标签: go afnetworking-2

我是AFNetworking的新手,我试图用它与我在Go中编写的API进行对话。我很难让Authorization标头工作。我已经将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时,我在服务器日志中看到以下标题(缺少授权):

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: [*/*]

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

更新 我添加了AFNetworkActivityLogger,以便我可以看到每个请求。确实包含了Authorization标头。此外,我尝试点击http://headers.jsontest.com,它返回从客户端收到的HTTP请求标头。该输出中存在授权标题

所以,问题必须在我的服务器上。我已经记录了每个请求的所有标头,而且我不确定要查看的位置。要用Go来标记这个问题,看看是否有人有想法。

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

这是Go Code

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")))

}

1 个答案:

答案 0 :(得分:1)

在Go已经解析之后,您显示的服务器日志看起来像标题。查看Go收到的原始纯文本HTTP标头会很有帮助。这会告诉你Go是否忽略了标题,或者上游是否正在剥离它。

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

如果你只是想在每个请求上发送一个简单的身份验证令牌,那么如果你只是使用了一个组成的X-标题,那么你表示你设置的其他标题就好了吗?