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_OPTION_TWICE
是 CURL_FORMADD_*
常量,值为 2。如果不正确,2
表示什么?
将value1
和value2
声明为CString
似乎不会影响结果(仍然得到2
)
我已经在我的第二条评论中解释了如何找出错误代码 2 的含义。如果您查看 curl.h,搜索“curl_formadd”,您会发现列出该函数返回码的注释。显然,2 表示 CURL_FORMADD_OPTION_TWICE,意思是:“一个选项给一个表单两次”。不知道那是什么意思。也许您的表单数据不正确,有重复的 ID。以上是关于curl_formadd 在第一次调用时返回 `CURL_FORMADD_OPTION_TWICE`的主要内容,如果未能解决你的问题,请参考以下文章
PHP foreach循环里面调用函数,需要等函数返回成功才能进入下一次循环,怎么弄呢?
闲置时,带有 Lambda 的 API 网关在第一次调用时返回 404?