Charles Map Local не работает для данных JSON?

Я пытаюсь имитировать (издеваться) с сервером, используя Чарльза. Я узнал, что у Чарльза есть что-то, называемое "Map Local...", которое позволяет мне отвечать клиенту, используя файлы, которые я сохранил локально.

Файлы, на которые я указываю, были сохранены, щелкнув правой кнопкой мыши в списке Charles Sequence и выбрав "Save Response...".

Однако при тестировании этого приложения iOS я получаю следующее сообщение об ошибке:

Failed to get areas: Error Domain=AFNetworkingErrorDomain Code=-1016 "Expected content type {(
    "text/json",
    "application/json",
    "text/javascript"
)}, got text/plain" 

Итак, почему-то я не отправляю ответ с правильной информацией заголовка для типа Content. Есть ли способ сказать Чарльзу, что ответ JSON? Возможная проблема заключается в том, что хранящиеся файлы содержат только данные JSON, а не какой-либо заголовок.

Ответ 1

Вам нужно добавить правило перезаписи в Charles, чтобы изменить заголовок Content-Type обратно в application/json.

Map Local будет предоставлять только текстовый/обычный Content-Type.

Для этого откройте "Инструменты" > "Переписать..." > "Добавить".

Добавьте все локации, которые вы сопоставляете локально, а затем для правил, добавьте один из них, который выглядит следующим образом:

rewrite rule

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

Ответ 2

Я знаю, что вы спрашиваете, как рассказать Чарльзу, как рассматривать JSON, но, с другой стороны, есть еще одно решение.

Я вижу, что вы используете AFNetworking. Ваш запрос ожидает получить "text/json", "application/json", "text/javascript", но ваши файлы text/plain, поэтому нам нужно изменить это.  При построении AFHTTPRequestOperation вы можете установить acceptableContentTypes с помощью этой строки кода operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];

Таким образом, весь код может выглядеть так:

AFHTTPRequestOperation* operation = [manager HTTPRequestOperationWithRequest:req success:^(AFHTTPRequestOperation *operation, id responseObject) {

   //success

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

  //failure
 }];

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
[operation start];