http
  • elixir
  • 2016-05-23 5 views 4 likes 
    4

    Ich versuche, eine HTTP-AnfrageHTTPOISON - einfügen Körperparameter in Elixier

    def getPage() do 
        url = "http://myurl" 
        body = '{ 
           "call": "MyCall", 
           "app_key": "3347249693", 
           "param": [ 
            { 
             "page"   : 1, 
             "registres"  : 100, 
             "filter"  : "N" 
            } 
           ] 
          }' 
    
        headers = [{"Content-type", "application/json"}] 
        HTTPoison.post(url, body, headers, []) 
    end 
    

    dies funktioniert gut für mich zu tun.

    Meine Frage ist - wie kann ich Variablen in die Körperanforderung einfügen. Bedeutung:

    def getPage(key, page, registers, filter) do 
        url = "http://myurl" 
        body = '{ 
           "call": "MyCall", 
           "app_key": key, 
           "param": [ 
            { 
             "page"   : page, 
             "registres"  : registers, 
             "filter"  : filter 
            } 
           ] 
          }' 
    
        headers = [{"Content-type", "application/json"}] 
        HTTPoison.post(url, body, headers, []) 
    end 
    

    wenn ich es benutze ich

    %HTTPoison.Response{body: "\nFatal error: Uncaught exception 'Exception' with message 'Invalid JSON object' in /myurl/www/myurl_app/api/lib/php-wsdl/class.phpwsdl.servers.php:... 
    

    irgendwelche Vorschläge?

    Antwort

    11

    Sie sollten wirklich einen JSON-Encoder wie Poison dafür verwenden.

    url = "http://myurl" 
    body = Poison.encode!(%{ 
        "call": "MyCall", 
        "app_key": key, 
        "param": [ 
        %{ 
         "page": page, 
         "registres": registers, 
         "filter": filter 
        } 
        ] 
    }) 
    headers = [{"Content-type", "application/json"}] 
    HTTPoison.post(url, body, headers, []) 
    
    +0

    Dank! Es klappt! – dina

    2

    Sie müssen die Werte interpolate:

    body = '{ 
          "call": "MyCall", 
          "app_key": "#{key}", 
          "param": [ 
           { 
            "page"   : #{page}, 
            "registres"  : "#{registres}", 
            "filter"  : "#{filter}" 
           } 
          ] 
         }' 
    

    Wenn Sie eine JSON-Bibliothek (Poison ist eine beliebte Wahl) Dann könnte man so etwas tun Elixir Datenstrukturen in eine JSON-Darstellung zu aktivieren:

    body = %{ 
          call: "MyCall", 
          app_key: key, 
          param: [ 
           { 
            page: page, 
            registres: registers, 
            filter: filter 
           } 
          ] 
         } |> Poison.encode!() 
    
    +0

    die Interpolation hier nicht aus irgendeinem Grund arbeiten .. – dina

    Verwandte Themen