17

我正在尝试使用 Charles 模拟(模拟)服务器。我发现 Charles 有一个叫做“Map Local...”的东西,它允许我使用我在本地存储的文件回复客户。

通过右键单击查尔斯序列列表并选择“保存响应...”来存储我指向的文件。

但是,在使用我的 iOS 应用程序进行测试时,我收到以下错误消息:

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

所以不知何故,我没有发送带有正确内容类型标头信息的响应。有没有办法告诉查尔斯响应是 JSON?一个可能的问题是存储的文件只包含 JSON 数据而不包含任何标题。

4

2 回答 2

40

您需要在 Charles 中添加重写规则以将 Content-Type 标头更改回 application/json。

Map Local 只会给出一个 text/plain Content-Type。

为此,请转到工具 > 重写... > 添加。

添加您在本地映射的所有位置,然后为规则添加一个如下所示的位置:

重写规则

我绝不会建议只为 Charles 调整您的代码,因为如果您不能准确地复制它们,那么这会破坏测试您的 Web 服务的意义。

于 2014-02-18T14:02:58.547 回答
0

我知道您在问如何告诉查尔斯将响应视为 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];
于 2014-02-18T11:33:13.093 回答