【问题标题】:ASIHTTPRequest POST splits up header + data?ASIHTTPRequest POST 拆分标头 + 数据?
【发布时间】:2011-02-14 23:23:00
【问题描述】:

我正在使用 ASIHTTPRequest 将数据发布到 iPhone 4.2.1 上的远程服务器。当我向我们的服务器发出以下 post 请求时,我收到 400 响应(我删除了 IP 地址):

   NSString dataString = @"data1=00&data2=00&data3=00";

   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:<ipremoved>]]];
   [request appendPostData:[dataString dataUsingEncoding:NSUTF8StringEncoding]];
   [request setRequestMethod:@"POST"];
   [request addRequestHeader:@"User-Agent" value:@"iphone app"];
   [request addRequestHeader:@"Content-Type" value:@"application/octet-stream"];
   request.delegate = self;
   [request startAsynchronous];

当我使用 curl 发送相同的数据时,我收到 200 响应:

    curl -H "User-Agent: iphone app" -H "Accept:" -H "Content-Type:application/octet-stream" --data-ascii "data1=00&data2=00&data3=00" --location <ipremoved> -v

我的同事说,在失败的情况下,ASIHTTPRequest 需要两个套接字读取:一个用于标头,一个用于数据。显然服务器目前不具备正确解析它的能力,所以我正在尝试解决它。

如果我在 iPhone 和我的 Mac 之间设置代理并运行 Paros(查看数据包),问题就会消失。 Paros 将标头和数据结合起来,以便服务器在单个套接字读取中全部获取。

我尝试了其他帖子中建议的一些方法,包括禁用持久连接,但我没有任何运气。我也尝试过执行 ASIHTTPFormRequest,但服务器不喜欢生成的数据格式。

任何建议将不胜感激。

谢谢。

【问题讨论】:

    标签: ios4 curl asihttprequest


    【解决方案1】:

    “我的同事说,在 失败案例,ASIHTTPRequest 需要两个套接字读取:一个用于 标题和一个用于数据。 显然服务器目前没有 有能力正确解析这个,所以我 我正在努力解决它。”

    你知道这是事实,还是猜测?这样的 HTTP 服务器会非常损坏,并且会导致各种随机问题。

    您是否查看过 Paros 接收和发送的内容?可能是偶然修复了请求中的错误,如果是,您可以以相同的方式修复请求。

    【讨论】:

    • 我能够确认完整的 HTTP 请求是在两个 TCP 段中发送的——一个仅包含标头,另一个包含数据。 Paros 在发送之前将这两个 TCP 段简单地组合成一个 TCP 段。我同意服务器看起来确实损坏或至少配置不正确。
    • 确实看起来有点奇怪——如果请求超过1500字节怎么办?它将/必须/分成2个数据包。我很欣赏 Paros 所做的最明显的事情是将两个数据包结合起来(很抱歉在这一点上费力,但 http 代理重写请求很常见):您是否逐字节检查数据包并确保这是唯一的区别吗?
    • 我实际上可以验证这就是 ASIHttpRequest 正在做的事情,我已经在我的 Mac 上设置了 Wireshark 并观察了它的发生。由于相同的服务器端问题,我正在处理相同的问题-我遇到的问题是我无法控制的第 3 方系统-在他们这边,他们基本上做了相同的组合并且它通过了,不确定在哪里从这里出发
    猜你喜欢
    • 2023-03-17
    • 2011-12-19
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多