我该如何在法拉第中使用带有“ application / x-www-form-urlencoded”和“ multipart / form-data;”的post方法发送此JSON?标头?
def test_updated(df,filename,keys=["price"]):
x=df.groupby(keys).size()
filename = "{}s_price.txt".format(filename)
x.to_csv(filename,sep='\t')
我尝试过:
message = {
"name":"John",
"age":30,
"cars": {
"car1":"Ford",
"car2":"BMW",
"car3":"Fiat"
}
}
此cURL请求有效
conn = Faraday.new(url: "http://localhost:8081") do |f|
f.request :multipart
f.request :url_encoded
f.adapter :net_http
end
conn.post("/", message)
但是我不太了解如何在法拉第工作。另外,cURL请求中的数据不是嵌套的JSON,因此我需要能够动态创建请求的主体,因为我无法提前知道JSON的确切结构。
如果您需要更多细节或清晰度,请提出任何问题。
谢谢!
答案 0 :(得分:1)
对于POST请求,Faraday希望表单数据作为JSON 字符串,而不是Ruby哈希。可以使用json gem's Hash#to_json
这样的方法轻松完成此操作:
require 'json'
url = 'http://localhost:8081'
form_data = {
name: 'John',
age: '30',
cars: {
car1: 'Ford',
car2: 'BMW',
car3: 'Fiat'
}
}.to_json
headers = {}
Faraday.post(url, form_data, headers)
或者在您的实例中只是:
conn = Faraday.new(url: "http://localhost:8081") do |f|
f.request :multipart
f.request :url_encoded
f.adapter :net_http
end
# exact same code, except just need to call rrequire json and call to_json here
require 'json'
conn.post("/", message.to_json)
答案 1 :(得分:0)
POST的默认内容类型为x-www-form-urlencoded
,因此哈希将被自动编码。 JSON没有这种自动数据处理功能,这就是下面的第二个示例传递哈希的字符串表示形式的原因。
Faraday.new(url: 'http://localhost:8081').post('/endpoint', {foo: 1, bar: 2})
# => POST http://localhost:8081/endpoint
# with body 'bar=2&foo=1'
# including header 'Content-Type'=>'application/x-www-form-urlencoded'
Faraday.new(url: 'http://localhost:8081').post('/endpoint', {foo: 1, bar: 2}.to_json, {'Content-Type'=>'application/json'})
# => POST http://localhost:8081/endpoint
# with body '{"foo":1,"bar":2}'
# including header 'Content-Type'=>'application/json'
我不确定您打算做什么,但是您可以发送类似以下内容的邮件
Faraday.new(url: 'http://localhost:8081').post('/endpoint', {foo: 1, bar: 2}.to_json)
# => POST http://localhost:8081/endpoint
# with body '{"foo":1,"bar":2}'
# including header 'Content-Type'=>'application/x-www-form-urlencoded'
但是,在Ruby中这将被解释为{"{\"foo\":1,\"bar\":2}" => nil}
。如果您要在另一端解析数据,则可以使其正常工作,但通常很难克服常规。