使用libcurl更改Content-type

时间:2017-06-23 07:01:23

标签: c http post http-headers libcurl

我有这段代码:

#include <curl/curl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if(curl)
    {
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        curl_easy_setopt(curl, CURLOPT_URL, "localhost/rest-v1/devices/did1/tasks");
        curl_easy_setopt(curl,CURLOPT_PORT,22080);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"hello\" : \"darkness\"}");

        res = curl_easy_perform(curl);

    }

    curl_easy_cleanup(curl);
    return 0;
}

当我运行它时,我在控制台上获得此打印:

*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 22080 (#0)
> POST /rest-v1/devices/did1/tasks HTTP/1.1
Host: localhost:22080
Accept: */*
Content-Length: 16
Content-Type: application/x-www-form-urlencoded

* upload completely sent off: 16 out of 16 bytes
< HTTP/1.1 415 Unsupported Media Type
< Server: Restlet-Framework/2.3.9
< Date: Fri, 23 Jun 2017 06:44:09 GMT
< Content-type: application/json; charset=UTF-8
< Content-language: *
< Content-length: 35
< Accept-ranges: bytes
< 
* Curl_http_done: called premature == 0
* Connection #0 to host localhost left intact

因此它返回415 Unsupported Media Type错误代码。

我在StackOverflow上发现它可能是由Context-type中的charset = UTF-8引起的。 所以我的问题是,如何编辑此字段以满足我的需求(删除charset = UTF-8)。 link

如何更改内容类型。由于我是HTTP协议的新手,请详细说明。

1 个答案:

答案 0 :(得分:2)

根据URL /rest-v1/devices/did1/tasks,您正在使用 IBM Business Process Manager REST接口。文档说明:

  

媒体类型

     

请求或响应中包含的数据将属于其中一个   以下媒体类型:

     

<强>应用/ JSON :       JSON(JavaScript Object Notation) - 这是默认的响应内容类型。有关每个返回对象的详细格式,请参阅   每个操作的JSON模式规范。

     

<强>应用/ XML :       XML(可扩展标记语言) - 基于XML的数据的格式由随产品提供的XML模式指定。   / properties / schemas / bpmrest / v1目录。摘录   这些模式也在每个文档中提供   操作

     

<强>应用程序/ x-JavaScript的:       JSONP(带填充的JSON) - 此格式可用作JSON的替代。在这种情况下,每个返回的JSON响应都是   包装在JavaScript回调函数调用中。要用这个   功能,您还必须指定回调URI查询参数。

因此,您必须为您的请求而不是application/x-www-form-urlencoded选择其中一种内容类型(不是上下文类型!)。在示例代码段中,您使用的是JSON,因此适当的数据类型为application/json。您可以按如下方式进行设置:

struct curl_slist *hs=NULL;
hs = curl_slist_append(hs, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hs);

这应该消除您观察到的HTTP错误415。