Как мы имитируем лазурную конечную точку?

Я работаю с конечной точкой Azure API. ....azure-api.net/.... Когда я пытаюсь просмотреть HTTP-запрос/ответ с использованием прокси-сервера Charles, HTTP-ответ пуст. Запрос работает, когда я выключаю прокси.

Я хочу перехватывать запросы и издеваться над ответом для целей автоматизации тестов.

Я могу просматривать другие конечные точки HTTP на других серверах, используя прокси-сервер Charles. Поэтому я считаю, что в лазури есть что-то особенное, что препятствует выполнению запроса.

  • Как лазурь знает, что посередине есть прокси, и он не разговаривает с клиентом?
  • Можно ли как-то настроить лазурный API, чтобы Чарльз работал? (Поскольку просмотр HTTP-трафика полезен для разработки)
  • Есть ли другой метод, который позволит издеваться над лазурным трафиком? Например. перенаправление хоста?

Я использую стандартный сетевой код iOS

NSURL *url = [NSURL URLWithString:@"https://MyDomain.azure-api.net/a/b/2?subscription-key=myKey"];

[[[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest requestWithURL:url]
                                 completionHandler:
  ^(NSData *data, NSURLResponse *response, NSError *error) {

    NSLog(@"%@, error: %@", [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding], error);
    ;

}] resume];

Ниже приведены скриншоты из Charles Proxy. Нет ответа после запроса на подключение.

Запрос


person Robert    schedule 01.09.2014    source источник
comment
если вы работаете на платформе Windows, пробовали ли вы использовать Fiddler (telerik.com/download/fiddler ) для захвата HTTP-трафика? Я не видел веб-трафика, который нельзя было бы обработать с помощью Fiddler.   -  person astaykov    schedule 05.09.2014
comment
Что вы используете, чтобы сделать запрос в приложении для iOS? Можете ли вы получить доступ к ответу JSON в своем коде?   -  person Moxy    schedule 07.09.2014
comment
@Moxy - мы используем NSURLConnection с оболочкой AFNetworking. Мы можем видеть запрос и ответ в коде, когда Чарльз не запущен. Когда Чарльз работает, соединение завершается ошибкой SSL.   -  person Robert    schedule 18.09.2014
comment
@astaykov - я считаю, что Fiddler захватывает пакеты, которые не подходят для данных SSL. Нам нужно эффективно провести атаку «человек посередине» для захвата данных из SSL-соединения. Это то, что Чарльз делает с самозаверяющим сертификатом. Однако это не работает для этого SSL-соединения, и я не знаю, почему.   -  person Robert    schedule 18.09.2014
comment
Я думаю, что у меня есть решение вашей проблемы, но мне нужно, чтобы вы разместили код того, где вы делаете сетевой запрос и какой объект делает его, чтобы быть как можно более точным. Поэтому, пожалуйста, опубликуйте эту часть вашего кода!   -  person Moxy    schedule 19.09.2014
comment
@Moxy - опубликованный код.   -  person Robert    schedule 19.09.2014
comment
@Robert, вы правы, Fiddler выполняет захват пакетов, и с этим нет абсолютно никаких проблем, когда все работает в одном и том же поле. Fiddler был бы бесполезен, если бы не мог расшифровать HTTPS-трафик...   -  person astaykov    schedule 19.09.2014


Ответы (1)


Чтобы перехватить запрос и вернуть поддельный ответ, вы можете использовать OHHTTPStubs.

Чтобы иметь возможность сделать это, вы должны либо зарегистрировать ответ при отладке из Xcode, либо использовать документацию.

Перед выполнением теста вызовите

stub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
             return [request.URL.absoluteString isEqualToString:@"https://MyDomain.azure-api.net/a/b/2?subscription-key=myKey"];
         }
                           withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) {
                                           NSString *fixture = OHPathForFileInBundle(@"fakeResponse.json", nil);
                                           return [OHHTTPStubsResponse responseWithFileAtPath:fixture
                                                                                   statusCode:200
                                                                                      headers:@{@"Content-Type":@"text/json"}];
                                       }];

И после того, как вы выполните свой тест, вы должны позвонить

[OHHTTPStubs removeStub:stub];

"fakeResponse.json" должен быть файлом, добавленным только в вашу тестовую цель, и у вас могут быть разные тесты с разными JSON файлами. Например, вы можете передать JSON с ошибкой или пустым содержимым, чтобы проверить, ведет ли ваше приложение так, как вы хотите.

person Moxy    schedule 22.09.2014