簡體   English   中英

Elixir httpc生產錯誤

[英]Elixir httpc error on production

我想使用:httpc作為我的HTTP客戶端。

我將edeliver用於發布管理等。 我的.deliver/config.exs:inets:httpc

  set applications: [
    :runtime_tools,
    :inets,
    :httpc
  ]

我還補充:inets:extra_applicationsmix.exs

這是我的使用方式:httpc

headers =
  if apikey,
    do: [{'Content-Type', 'application/json'}, {'apikey', to_charlist(apikey)}],
    else: [{'Content-Type', 'application/json'}]

http_options = [timeout: @timeout, connect_timeout: @timeout]
options = []

request = {
  to_charlist(url),
  headers,
  'application/json',
  to_charlist(encoded_obj)
}

:post
|> :httpc.request(request, http_options, options)
|> handle_response()

我收到很多錯誤,例如:

=SUPERVISOR REPORT==== 6-Mar-2018::15:44:11 ===
     Supervisor: {local,httpc_handler_sup}
     Context:    child_terminated
     Reason:     {function_clause,
                     [{http_transport,close,
                          [undefined,#Port<0.21557>],
                          [{file,"http_transport.erl"},{line,346}]},
                      {gen_server,try_terminate,3,
                          [{file,"gen_server.erl"},{line,648}]},
                      {gen_server,terminate,10,
                          [{file,"gen_server.erl"},{line,833}]},
                      {proc_lib,init_p_do_apply,3,
                          [{file,"proc_lib.erl"},{line,247}]}]}
     Offender:   [{pid,<0.2596.1>},
                  {id,undefined},
                  {mfargs,{httpc_handler,start_link,undefined}},
                  {restart_type,temporary},
                  {shutdown,4000},
                  {child_type,worker}]

並且

15:44:11.743 [error] GenServer #PID<0.2595.1> terminating
** (FunctionClauseError) no function clause matching in :http_transport.close/2
    (inets) http_transport.erl:346: :http_transport.close(:undefined, #Port<0.21559>)
    (stdlib) gen_server.erl:648: :gen_server.try_terminate/3
    (stdlib) gen_server.erl:833: :gen_server.terminate/10
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Last message: {:init_error, :error_sending, {#Reference<0.18155839.2531262466.203553>, {:error, :einval}}}

相同錯誤報告的方式有所不同。

這行說的話我也不太明白:

15:44:11.741 [error] Bad value on output port 'tcp_inet'

我真的不明白為什么會這樣。

我正在使用HTTPotion ,但是沒有這個問題(盡管有其他問題)。

問題是這可以在我的開發機器上工作。 它也可以在我的機器上的類似生產的VM上運行。 但是當它在實際生產服務器上運行時會引發此錯誤。

我很混亂!

在erlang中, httpc:request()函數有一個Request參數變量:

request(Method, Request, HTTPOptions, Options) -> 

Request參數變量的類型指定為:

Request = request()
request() = {url(), headers()}

其中url() = string()headers() = [header()] ,即一個列表,因此Request參數的形狀需要為:

{string, []}

但是,您正在這樣做:

request = {
  to_charlist(url),
  headers,
  'application/json',
  to_charlist(encoded_obj)
}

看起來像是:

{string, [], string, string}

我不知道為什么要在標頭列表之外復制“ application / json”的Content-Type,而且我不清楚to_charlist(encoded_obj)應該是什么。 我會嘗試:

request = {
  to_charlist(url),
  headers
}

如果to_charlist(encoded_obj)必須位於http標頭中,則將適當的鍵/值對添加到標頭列表中。 可能的http標頭在這里 也許您需要:

headers = 
  if api,
     do: [{'Content-Type', 'application/json'}, 
          {'apikey', to_charlist(apikey)}, 
          {'Authorization, to_charlist(encoded_obj)} ],
     else: [{'Content-Type', 'application/json'}, 
            {'Authorization, to_charlist(encoded_obj)} ]

最好寫成:

base_headers = [
    {'Content-Type', 'application/json'},
    {'Authorization', to_charlist(encoded_obj)}
]

request_headers = 
    if apikey,
        do: [ {'apikey', to_charlist(apikey)} | base_headers ],
        else: base_headers

問題是這可以在我的開發機器上工作。 它也可以在我的機器上的類似生產的VM上運行。 但是當它在實際生產服務器上運行時會引發此錯誤。

好吧,然后看這里:

輸出端口“ tcp_inet”上的值錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM