【问题标题】:curl_formadd returns `CURL_FORMADD_OPTION_TWICE` on first callcurl_formadd 在第一次调用时返回 `CURL_FORMADD_OPTION_TWICE`
【发布时间】:2014-04-17 22:10:07
【问题描述】:

我正在尝试使用 libcurl 构建一个 HTTP 表单,但我无法让它正常工作。每次我调用curl_formadd 时,它都会返回CURL_FORMADD_OPTION_TWICE。有关此错误的唯一信息表明 libcurl 认为我正在尝试添加两个具有相同名称的表单元素,即使它是第一次调用 curl_formadd 而我只添加了一个元素!

  Declare Function curl_global_init Lib "libcurl" (flags As Integer) As Integer
  Declare Function curl_formadd Lib "libcurl" (FirstItem As Ptr, LastItem As Ptr, Option1 As Integer, Value1 As Ptr, Option2 As Integer, Value2 As Ptr, EndMarker As Integer) As Integer

  Const CURLFORM_COPYCONTENTS = 2
  Const CURLFORM_COPYNAME = 1
  Const CURLFORM_END = 17

  Dim formname, formvalue As MemoryBlock
  formname = "NAME"
  formvalue = "CONTENTS"

  If curl_global_init(3) = 0 Then
    Dim first, last As Ptr
    Dim err As Integer
    err = curl_formadd(first, last, CURLFORM_COPYNAME, formname, CURLFORM_COPYCONTENTS, formvalue, CURLFORM_END)
    Break
    ' err is 2 (CURL_FORMADD_OPTION_TWICE) 
  End If

这个错误想告诉我什么?

【问题讨论】:

    标签: libcurl realbasic xojo realstudio


    【解决方案1】:

    阅读 curl_formadd() 的“手册”页,上面写着:

    指针 firstitem 和 lastitem 在第一次调用这个函数时都应该指向 NULL。

    但是,您为这些传递 NULL。

    您似乎也错误地传递了字符串。尝试将 Value1 和 Value2 参数定义为“作为 CString”,然后传递普通字符串,而不是 Memoryblocks。

    最后,您给了 CURLFORM_COPYCONTENTS 错误的代码。不是 2 而是 4。请参阅 curl.h 中的 CURLformoption 枚举:“CFINIT(NOTHING)”的值为 0,超过该值的每个项目都会变高,因此 CFINIT(COPYCONTENTS) 的值为 4。

    这是适合我的代码:

    Declare Function curl_global_init Lib "libcurl" (flags As Integer) As Integer
    Declare Function curl_formadd Lib "libcurl" (ByRef FirstItem As Ptr, ByRef LastItem As Ptr, Option1 As Integer, Value1 As CString, Option2 As Integer, Value2 As CString, EndMarker As Integer) As Integer
    
    Const CURLFORM_COPYCONTENTS = 4
    Const CURLFORM_COPYNAME = 1
    Const CURLFORM_END = 17
    const CURL_GLOBAL_ALL = 3
    
    Dim formname, formvalue As String
    formname = "NAME"
    formvalue = "CONTENTS"
    
    If curl_global_init(CURL_GLOBAL_ALL) = 0 Then
      Dim first, last As Ptr
      Dim err As Integer
      err = curl_formadd(first, last, CURLFORM_COPYNAME, formname, CURLFORM_COPYCONTENTS, formvalue, CURLFORM_END)
      Break
      ' err is 0
    End If
    

    【讨论】:

    • 谢谢,但我仍然收到CURL_FORMADD_OPTION_TWICE。
    • 错误代码 2 并不表示 CURL_FORMADD_OPTION_TWICE,而是列出的错误代码如下所述:“非零表示发生了与 中定义的 CURL_FORMADD_* 常量相对应的错误”
    • CURL_FORMADD_OPTION_TWICE 是 CURL_FORMADD_* 常量,值为 2。如果不正确,2 表示什么?
    • 将value1 和value2 声明为CString 似乎不会影响结果(仍然得到2)
    • 我已经在我的第二条评论中解释了如何找出错误代码 2 的含义。如果您查看 curl.h,搜索“curl_formadd”,您会发现列出该函数返回码的注释。显然,2 表示 CURL_FORMADD_OPTION_TWICE,意思是:“一个选项给一个表单两次”。不知道那是什么意思。也许您的表单数据不正确,有重复的 ID。
    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 2020-06-21
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2018-09-25
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多