curl_formadd 在第一次调用时返回 `CURL_FORMADD_OPTION_TWICE`

Posted

技术标签:

【中文标题】curl_formadd 在第一次调用时返回 `CURL_FORMADD_OPTION_TWICE`【英文标题】:curl_formadd returns `CURL_FORMADD_OPTION_TWICE` on first call 【发布时间】: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

这个错误想告诉我什么?

【问题讨论】:

【参考方案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_TWICECURL_FORMADD_* 常量,值为 2。如果不正确,2 表示什么? value1value2 声明为CString 似乎不会影响结果(仍然得到2 我已经在我的第二条评论中解释了如何找出错误代码 2 的含义。如果您查看 curl.h,搜索“curl_formadd”,您会发现列出该函数返回码的注释。显然,2 表示 CURL_FORMADD_OPTION_TWICE,意思是:“一个选项给一个表单两次”。不知道那是什么意思。也许您的表单数据不正确,有重复的 ID。

以上是关于curl_formadd 在第一次调用时返回 `CURL_FORMADD_OPTION_TWICE`的主要内容,如果未能解决你的问题,请参考以下文章

函数在第一次调用时返回字符串,在后续调用时返回一个对象

PHP foreach循环里面调用函数,需要等函数返回成功才能进入下一次循环,怎么弄呢?

闲置时,带有 Lambda 的 API 网关在第一次调用时返回 404?

React 登录错误消息在第一次调用时返回未定义,然后在第二次调用时显示错误

C语言函数的运用和调用?

C语言中函数调用怎么返回两个值