尝试在 Ruby 中复制移动应用 POST 请求,出现 502 网关错误

Trying to replicate Mobile App POST Request in Ruby, Getting 502 Gateway Error

我正在尝试使用 Ruby 自动执行我可以在 iPhone 应用程序中手动执行的操作,但是当我这样做时,我收到 502 错误网关错误。

使用 Charles Proxy 我收到了 iPhone 应用发出的请求:

POST /1.1/user/-/friends/invitations HTTP/1.1
Host: redacted.com
Accept-Locale: en_US
Accept: */*
Authorization: Bearer REDACTED
Content-Encoding: gzip
Accept-Encoding: br, gzip, deflate
Accept-Language: en_US
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 66
Connection: keep-alive
X-App-Version: 814

invitedUserId=REDACTED&source=PROFILE_INVITATION

我在 Ruby 中编写了以下代码来发送相同的请求:

@header_post = {
  "Host" => "redacted.com",
  "Accept-Locale" => "en_US",
  "Accept" => "*/*",
  "Authorization" => "Bearer REDACTED",
  "Content-Encoding" => "gzip",
  "Accept-Encoding" => "br, gzip, deflate",
  "Accept-Language" => "en_US",
  "Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8",
  "Connection" => "keep-alive",
  "X-App-Version" => "814"
}
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
path = '/1.1/user/-/friends/invitations'

data = "invitedUserId=REDACTED&source=PROFILE_INVITATION"

resp, data = http.post(path, data, @header_post)

不幸的是,当 运行 这段代码时,我收到了 502 Bad Gateway Error。

我注意到一件事,我认为这是这里解决方案的关键,在移动应用程序发出的 POST 请求中,内容长度为 66。但是字符串的长度 "invitedUserId=REDACTED&source=PROFILE_INVITATION" 未编辑的 userId 只有 46.

我是否遗漏了另一个格式为“¶m=value”且长度为 20 的表单变量?还是我漏掉了什么?

提前致谢!

这可能与您发送的 body 长度没有直接关系。

我在这里看到可能有 2 个问题:

  • 502 错误:您的 uri.hostport 正确吗? 502 错误意味着服务器端有问题。也可以尝试删除 Host header.
  • body 内容未压缩

您正在定义一个 header Content-Encoding: gzip 但您没有压缩数据(Net::Http 不会自动执行)。

尝试类似的东西:

require "gzip"

@header_post = { 
  # ... 
}

http = Net::HTTP.new(uri.host, uri.port)
path = '/1.1/user/-/friends/invitations'

data = "invitedUserId=REDACTED&source=PROFILE_INVITATION"

# instanciate a new gzip buffer
gzip = Zlib::GzipWriter.new(StringIO.new)

# append your data
gzip << data

# get the gzip body and use it in your request
body = gzip.close.string
resp, data = http.post(path, body, @header_post)

或者,服务器可能正在接受 non-gzipped 内容。您可以通过删除 Content-Encoding 来尝试 您的原始代码出错。

但是,如果这是唯一的错误,服务器不应发送 502 而是 4xx 错误。所以我猜 uri 配置还有另一个问题,就像上面建议的那样。