尝试在 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.host
和 port
正确吗? 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 配置还有另一个问题,就像上面建议的那样。
我正在尝试使用 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.host
和port
正确吗? 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 配置还有另一个问题,就像上面建议的那样。