C语言libcurl POST json串错误“Unsupported Media Type”

这两天在用libcurl发送http请求

代码写好了,联调时发现服务器老是返回“Unsupported Media Type”这个错误,不支持的媒体类型,百度谷歌了一圈遇见这个问题的不少,但是大多数没有把解决方案发出来。

其实很简单,如果能认真把curl的example例程看清楚就不会出现这样的问题。

下面把代码发出来,供后来者参考

帖子请看http://bbs.csdn.net/topics/390973641

int curl_post_res(const char*postdata,const char *url,cb_func func,void *data)
{
    CURLcode res = 0;
    char tmp[32]={0};
    CURL *curl=NULL;
    struct curl_slist *headers = NULL;
    if(!data)
        return -1 ;
    if( !url)
        return -1;
    jdebug(DEBUG_STATE,"url:%s\n",url);

    snprintf(tmp,sizeof(tmp),"Content-Length: %d",strlen(postdata));
    jdebug(DEBUG_STATE,"TMP=%s\n",tmp);
    headers = curl_slist_append(headers, "Accept: application/json");
    headers = curl_slist_append(headers, "Content-Type: application/json");
    headers = curl_slist_append(headers, "charset: utf-8");
    headers = curl_slist_append(headers, tmp);
    curl = curl_easy_init();//对curl进行初始化
    if(curl){
        curl_easy_setopt(curl, CURLOPT_URL, url); //设置下载地址
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, CURL_TIMEOUT);//设置超时时间
        curl_easy_setopt(curl, CURLOPT_POST, 1L);//设置超时时间
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);//设置超时时间
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, func);//设置写数据的函数
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, data);//设置写数据的变量
        res = curl_easy_perform(curl);//执行下载
        jdebug(DEBUG_STATE,"CURL perform is ok!\n");
        curl_easy_cleanup(curl);
        curl_slist_free_all(headers);
        return res;
    }else{
        jdebug(DEBUG_ERR,"curl easy init is err!\n");
        curl_slist_free_all(headers);
        return -2;
    }
}

其实错误就错在了curl_slist_append函数的使用上,这个函数的返回值是必须指向headers的,说实话看起来很变态,参数已经包含这个了,为什么还要返回值这样做!

libcurl官网上对这个api是这样描述的

NAME

curl_slist_append - add a string to an slist

SYNOPSIS

#include <curl/curl.h>

struct curl_slist *curl_slist_append(struct curl_slist * list, const char * string );

DESCRIPTION

curl_slist_append() appends a specified string to a linked list of strings. The existing list should be passed as the first argument while the new list is returned from this function.
The specified string has been appended when this function returns. curl_slist_append() copies the string.

The list should be freed again (after usage) with curl_slist_free_all.

RETURN VALUE

A null pointer is returned if anything went wrong, otherwise the new list pointer is returned.

看上面的红色字体,其实说的还是不够清晰!

Unsupported Media Type

时间: 2024-11-02 23:35:13

C语言libcurl POST json串错误“Unsupported Media Type”的相关文章

$.ajax访问RESTful Web Service报错:Unsupported Media Type

最近在项目中,前台页面使用jquery ajax访问后台CXF发布的rest服务,结果遇到了错误"Unsupported Media Type". 发布的服务java代码如下: import javax.jws.WebService; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produ

HTTP请求415错误 – 不支持的媒体类型(Unsupported media type)

HTTP请求415错误 – 不支持的媒体类型(Unsupported media type) 通常有以下情况: 1:检查你的 http 请求头信息,比如 因为 User-Agent 被服务器设置 拒绝请求了: 比如你写的的爬虫,就很有可能因为没有伪装成浏览器,被拒绝请求 user-agent 详情 2:查看你的 http 请求方法,以及服务器端的设置 比如:有一个 强制用 post 请求的接口,你是不是用了非post 请求 3:post 请求参数设置,是不是必须的,json 格式 比如下面,两段

AFNetworking报错:(415 Domain=com.alamofire.error.serialization.response Code=-1011 &quot;Request failed: unsupported media type (415)&quot;)

问题? 今天在与后台调接口的时候,遇到一个问题,使用AFNetworking报错,具体如下: Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unsupported media type (415)" UserInfo={com.alamofire.serialization.response.error.response=<NSHTTPURLResponse:

力所能及之springmvc NetworkError: 415 Unsupported Media Type

小狼今天在测试springmvc中从json字符串自动转换成实体的技术时,出现问题 首先,小狼创建一个web项目,在lib目录下导入springmvc jar文件,这就不细说了,然后加入json支持类库 在webroo目录下加载jquery.js   json2.js jsp文件是这么写的: <html> <head> <title>My JSP 'index.jsp' starting page</title> <script type="

调用Restful Service 出现415 Unsupported Media Type的问题(Rest Request Header中的Content-Type问题)

用Chrome的插件Simple REST Client 调用POST的REST服务时,老是报415错误,如图. 一开始就以为是服务端的问题,各种google,百度,折腾了一下午未果. 晚上继续看,一不小心看到返回的Response的Headers中Content-Type的值与冒号之间有一个空格,于是将Request的Content-Type:application/json;charset=UTF-8改成Content-Type: application/json;charset=UTF-8

SpringMVC 中HttpMessageConverter简介和Http请求415 Unsupported Media Type的问题

一.概述: 本文介绍且记录如何解决在SpringMVC 中遇到415 Unsupported Media Type 的问题,并且顺便介绍Spring MVC的HTTP请求信息转换器HttpMessageConverter. 二.问题描述: 在SprinvMVC的Web程序中,我在页面发送Ajax 的POST请求,然后在服务器端利用@requestBody接收请求body中的参数,当时运行过程中,我想服务器发送Ajax请求,浏览器一直反馈415 Unsupported Media Type或者40

Unsupported Media Type 415问题解决办法(Ajax)

场景:Ajax传一个jsuon对象到服务器,让参数自动封装至与json对象匹配的java对象中. 错误类型 错误类型1: "status":415 "error":"Unsupported Media Type" "exception":"org.springframework.web.HttpMediaTypeNotSupportedException" 原因:没有使用JSON.stringify(row

angularjs - 415 (Unsupported Media Type)

angularJs+springMVC angular表单提交一个user实体时,报 angularjs - 415 (Unsupported Media Type)错误!! 原因是$http({ url:'', method:'', //一下红色整个改为----------------------------data:user即可 params:{ user:user } }).success(function(data){ //.... }).error(function(data){ //

System.Net.WebException : The remote server returned an error: (415) UNSUPPORTED MEDIA TYPE

I am having problems with a bit of code that accesses a restful web service. Running this code, it errors out at var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); and the exception returned is: "System.Net.WebException : The remote se