当前位置: 首页 > 知识库问答 >
问题:

Libcurl获得响应“415不受支持的媒体类型”,但使用curl.exe运行良好

南门飞扬
2023-03-14

我不确定我做错了什么,但当使用curl中的命令时,不会发生错误。keep change my type tocontent-type:application/x-www-form-urlencoded即使声明了curl_easy_setopt(curl,CURLOPT_HEADER,“content-type:application/json”);下面是我的代码:

    curl_easy_setopt(curl, CURLOPT_URL, "https://zone1:50000/user/login");
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
    const std::string raw_json = R"json({ "username": "admin", "password": "password123"})json";

        Json::CharReaderBuilder builder {};
        auto reader = std::unique_ptr<Json::CharReader>( builder.newCharReader() );
        Json::Value root {};
        std::string errors {};
        const auto is_parsed = reader->parse( raw_json.c_str(),
                                              raw_json.c_str() + raw_json.length(),
                                              &root,
                                              &errors );
        if ( !is_parsed )
        {
            qDebug() << "ERROR: Could not parse! " << errors.c_str();
        }
        Json::FastWriter fastWriter;
        std::string output = fastWriter.write(root);
        qDebug() << "Parsed JSON:" << output.c_str();
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS,output.c_str());
    curl_easy_setopt(curl, CURLOPT_HEADER, "Origin: https://zone1:50000");
    curl_easy_setopt(curl, CURLOPT_ENCODING, "Accept-Encoding: gzip, deflate, br");
    curl_easy_setopt(curl, CURLOPT_HEADER, "Accept-Language: en-US,en;q=0.9");
    curl_easy_setopt(curl, CURLOPT_HEADER, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");
    curl_easy_setopt(curl, CURLOPT_HEADER, "Content-Type: application/json");
    curl_easy_setopt(curl, CURLOPT_HEADER, "Accept: application/json, text/plain, */*");
    curl_easy_setopt(curl, CURLOPT_HEADER, "Referer: https://zone1:50000/login");
    curl_easy_setopt(curl, CURLOPT_HEADER, "Connection: keep-alive");
    res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, cookies);
    res = curl_easy_perform(curl);

成功的curl命令:

curl --cookie cookie.txt -k -g "https://zone1:50000/user/login" -H "Origin: https://zone1:50000" -H "Accept-Encoding: gzip, deflate, br" -H "Accept-Language: en-US,en;q=0.9" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" -H "Content-Type: application/json" -H "Accept: application/json, text/plain, */*" -H "Referer: https://zone1:50000/login" -H "Cookie: JSESSIONID=Fn1" -H "Connection: keep-alive" --data-binary "{\"username\":\"admin\",\"password\":\"password\"}"

我收到的答复是:

>

  • 找到主机区域1的包:0x11CE588[串行]

    不能复用,即使我们想!

    重新使用现有连接!具有主机区域1的(#0)

    已连接到zone1(10.1.233.120)端口50000(#0)*>POST/USER/LOGIN HTTP/1.1主机:zone1:50000 Accept:/Accept-Encoding:Accept-Encoding:gzip,deflate,br content-length:44 content-type:application/x-www-form-urlencoded

    将包标记为不支持多用途 webserver="" server:webserver

  • 共有1个答案

    越涵衍
    2023-03-14

    您设置的头都是错误的,CURLOPT_HTTPHEADER的头列表不是一个字符*,它是一种特殊的列表,请尝试

    struct curl_slist *list = NULL;
    list = curl_slist_append(list, "Accept-Language: en-US,en;q=0.9");
    list = curl_slist_append(list, "Content-Type: application/json");
    list = curl_slist_append(list, "Accept: application/json, text/plain, */*");
    list = curl_slist_append(list, "Referer: https://zone1:50000/login");
    list = curl_slist_append(list, "Connection: keep-alive");
    curl_easy_setopt(curl, CURLOPT_HEADER, list);
    (...)
    curl_slist_free_all(list);
    (...)
    

    另外,不要使用CURLOPT_HEADER设置user-agent,因为如果将来执行多个请求,或者使用CURLOPT_FOLLOWLOCATION,curl将“忘记”用户代理,而使用CURLOPT_USERAGENT,这样curl就不会忘记它:

    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");
    
     类似资料:
    • 问题内容: 自数小时以来,我一直在尝试纠正http错误,但它仍显示不支持的页面。我在邮递员中添加标题。 这是我的Java代码 这是我的档案 问题答案: 通过和如何在响应流和请求流之间对对象进行序列化和反序列化。 将会发生的是,将从提供者的注册表中进行搜索,以查找可以处理的媒体类型。如果找不到,则Jersey无法处理该请求,并将发送415不支持的媒体类型。通常,你还应该在服务器端记录一个异常。不知道

    • 我已经创建了一个示例web服务来进行post调用。 我使用的是Jersey JAX-RS和Maven。

    • 我必须做的是,我必须在给定的URL中发布JSON数据,其中JSON看起来像 和我的功能 当我张贴它的时候;我得到一个错误 “远程服务器返回错误:(415)不支持的媒体类型。” 有人知道吗;我错在哪里?

    • 这以前适用于.NET 4.6上的ASP.NET MVC 5。

    • 问题内容: 我正在尝试使用jQuery 1.6(Jackson 2.1.1 和Spring 3.2.0 )通过JSON通过该方法向数据库中插入和/或更新数据。 JS代码如下。 通过URL映射的Spring控制器内部的方法如下。 服务器按照问题的含义进行响应, 415不支持的媒体类型 标头信息如下所示。 整个文件如下。 当我删除一个方法参数并仅用于接受请求参数时,它可以工作。 问题答案: 浏览器发送