java libcurl post参数_C/C++中libcurl的使用-提交 Http Post请求

之前介绍了使用libcurl的HTTP GET将url地址中内容下载到本地C/C++中libcurl的使用-Http GET方法使用详解,在更早的文章Linux下使用CURL模拟用户提交post表单中也介绍过在Linux环境使用curl命令提交POST表单。本文介绍使用libcurl的HTTP POST实现表单的提交,并获取表单的结果。

libcurl的相关接口已经在上一篇文章中介绍,本文只介绍新增的相关接口和参数选项。CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,const char *); //向curl_slist链表中追加参数,这些参数用于设置一个标准浏览器请求的相关参数。例如实际使用Chrome提交的请求参数如下:1

2

74a6d327f2083eaf38539651267c0026.pngCURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post); //CURLOPT_POST:参数post置为1表示libcurl将执行普通的HTTP POST操作,同时也意味着应该使用"Content-Type: application/x-www-form-urlencoded"作为请求的头部。1

2CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDS, char *postdata); //CURLOPT_POSTFIELDS:指针postdata指向的是POST操作所提供的所有参数,postdata的数据格式应该和server端想要接收数据的格式相同,如JSON格式或者使用相关连词符组成的。1

2CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE, long size); //CURLOPT_POSTFIELDSIZE:设置提交参数的大小,而不是依赖于libcurl默认使用strlen来衡量该大小。没有此项配置或者size被置为-1,都意味着由libcurl使用strlen来计算长度。如果提交的内容大小超过2GB,应该使用CURLOPT_POSTFIELDSIZE_LARGE参数替代CURLOPT_POSTFIELDSIZE。1

2CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename); //如果提交POST请求要读取cookie信息,可以使用如下的参数将cookie所在的地址传递进来,cookie数据的格式可以是旧版本的"Netscape / Mozilla"cookie格式,也可以是普通的HTTP header的dump文件。1

2

示例代码:#include #include #include #include #include #include #include using namespace std; struct MemoryStruct { char *memory; size_t size; MemoryStruct() { memory = (char *)malloc(1); size = 0; } ~MemoryStruct() { free(memory); memory = NULL; size = 0; } }; size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)data; mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); if (mem->memory) { memcpy(&(mem->memory[mem->size]), ptr, realsize); mem->size += realsize; mem->memory[mem->size] = 0; } return realsize; } int main() { CURLcode res = curl_global_init(CURL_GLOBAL_ALL); if(CURLE_OK != res) { cout<

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

在上述代码中,使用libcurl的POST选项将表单数据提交到相应的服务器,在正确响应结果后,将返回的json格式的数据写到本地的磁盘文件上。

posted on 2020-09-08 19:41 长戟十三千 阅读(116) 评论(0)  编辑 收藏 引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JNI是Java Native Interface的缩写,该技术允许Java应用程序调用本地编写的C/C++代码。因此,您可以使用JNI和libcurl库在Java应用程序进行POST请求。 下面是一个使用JNI和libcurl库进行完整的POST提交的示例代码: 1. Java代码 ```java public class CurlWrapper { static { System.loadLibrary("curlwrapper"); } public native String post(String url, String postData); } ``` 2. C/C++代码 ```c++ #include <jni.h> #include <curl/curl.h> #include <string.h> JNIEXPORT jstring JNICALL Java_CurlWrapper_post(JNIEnv *env, jobject obj, jstring url, jstring postData) { CURL *curl; CURLcode res; const char *urlStr = env->GetStringUTFChars(url, 0); const char *postDataStr = env->GetStringUTFChars(postData, 0); char *response = NULL; long responseCode; size_t responseLen = 0; struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, urlStr); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postDataStr); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunc); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); res = curl_easy_perform(curl); if (res == CURLE_OK) { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode); curl_easy_cleanup(curl); curl_slist_free_all(headers); responseLen = strlen(response); jstring result = env->NewStringUTF(response); free(response); env->ReleaseStringUTFChars(url, urlStr); env->ReleaseStringUTFChars(postData, postDataStr); return result; } else { curl_easy_cleanup(curl); curl_slist_free_all(headers); free(response); env->ReleaseStringUTFChars(url, urlStr); env->ReleaseStringUTFChars(postData, postDataStr); return NULL; } } } size_t writeFunc(char *ptr, size_t size, size_t nmemb, void *userdata) { size_t len = size * nmemb; char **response = (char **) userdata; *response = (char *) realloc(*response, len + 1); if (*response) { memcpy(*response, ptr, len); (*response)[len] = '\0'; } return len; } ``` 3. 编译 在Linux下,您可以使用以下命令编译C/C++代码: ``` gcc -shared -fPIC -o libcurlwrapper.so -I$JAVA_HOME/include -I$JAVA_HOME/include/linux curlwrapper.cpp -lcurl ``` 在Windows下,您可以使用以下命令编译C/C++代码: ``` gcc -shared -o curlwrapper.dll -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" curlwrapper.cpp -lcurl ``` 4. 调用 在Java代码,您可以使用以下代码调用CurlWrapper.post方法: ```java CurlWrapper curlWrapper = new CurlWrapper(); String response = curlWrapper.post("https://example.com/api/", "param1=value1&param2=value2"); ``` 其,第一个参数是目标URL,第二个参数POST请求的数据。如果请求成功,该方法将返回响应文本,否则将返回null。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值