如何使用Faraday的post方法将JSON作为表单数据发送

时间:2019-01-10 21:39:14

标签: json multipartform-data url-encoding faraday

我该如何在法拉第中使用带有“ 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的确切结构。

如果您需要更多细节或清晰度,请提出任何问题。

谢谢!

2 个答案:

答案 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}。如果您要在另一端解析数据,则可以使其正常工作,但通常很难克服常规。