This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL-CC3235SF:如何设置正文和标头的格式以使用 HttpClient_sendRequest () API?

Guru**** 2484615 points
Other Parts Discussed in Thread: CC3235SF

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1268430/launchxl-cc3235sf-how-to-format-body-and-header-to-use-httpclient_sendrequest-api

器件型号:LAUNCHXL-CC3235SF
主题中讨论的其他器件:CC3235SF

您好!

使用  HttpClient_sendRequest ()发送 POST 请求时出现404错误  。 我理解、如果我发送的正文或标题的格式有任何错误、就会发生这种情况。 我已经通过使用 postman 软件检查了网址,正文和标题,并与相同的信息,我得到200 OK 响应在 Postman。  

我想检查是否正在设置正文和标题的格式以正确的方式使用 HttpClient_sendRequest() API。

这是我正在使用的代码片段(为了保护隐私、实际的正文内容已更改、但格式相同)

 

httpClientHandle = HTTPClient_create(&statusCode,0);

if(statusCode < 0)

{

 UART_PRINT("httpTask: creation of http client handle failed %d", statusCode);

}



const char contentType[] = "application/json";

ret = HTTPClient_setHeader(httpClientHandle, HTTPClient_HFIELD_REQ_CONTENT_TYPE,
contentType, strlen(contentType), HTTPClient_HFIELD_PERSISTENT);

if(ret < 0){

 UART_PRINT("httpTask: setting content header failed %d", ret);

}



//HTTP Client connect to host

ret = HTTPClient_connect(httpClientHandle,"">https://baseurl.com",0,0);

if(ret < 0)

{

 UART_PRINT("httpTask: connect failed %d", ret);

}



 // Send POST request

const char body[] = "{\n\"param1\":\"xxxxx\",\n \"param2\":\"xx yyy xx\"\n}";

UART_PRINT("%s",body);

ret = HTTPClient_sendRequest(httpClientHandle,HTTP_METHOD_POST,"/endpointUrl/Url",body,strlen(body),0);

if(ret < 0)

{

  UART_PRINT("httpTask: send failed %d", ret);

}



if(ret != HTTP_SC_OK)

{

  UART_PRINT("httpTask: cannot get status %d", ret);

}

请通过查找我在上述代码中所做的错误来帮助您在格式方面导致400个错误或缺少一些重要方面。  

非常感谢您的帮助!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我正在将该主题分配给相关专家。

    此致!

    罗格利奥  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢! 等待他们的忏悔。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我在此代码段中看到的任何内容都不会导致 404错误。 请仔细检查您输入 HttpClient_sendRequest ()的"/endpointUrl/Url "。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Felicity:

    噢!

    1.正文格式是否正常-大括号、键和值对之间的冒号等?

    2.内容类型标题是否应该是"Content-Type:applciation/json"而不是"application/json"?

    3.在 HttpClient_sendRequest 函数中,请求 URI 是否 包含基址 URL 或者是否足够端点? 我的意思是,应该从 https://开始请求 Uri?

    谢谢!

    姆鲁杜拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mrudula:

    1.是的,整体正文 格式看起来是正确的。  

    2. "application/json" 应该适用于内容类型。 我刚刚注意到的小问题是、请检查内容类型输入顺序是否正确、函数名称是否 与 您使用的 SDK 版本一致。 在 simplelink_cc32xx_sdk_7_10_00_13的这个函数版本中, HttpClient_setHeader ()实际上是 HttpClient_setHeader  s ()并且内容类型是第四个输入-而不是第三个输入。

    3.我相信你可以从终点开始。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Felicity:

    感谢您的答复。

    1.我重新检查了端点 URL ,结果是正确的。  

    我使用的是简单 SDK V2.20。 因为正在使用的 API 是  HttpClient_setHeader() 。 我也选中了。 属性与函数签名同步。

    是否有办法可以打印出 API 发送的确切请求? 也许我就能知道在发送的 API 格式方面是否有任何错误。

    是否有任何其他 API 可用于发送来自 TI CC3235SF 的 HTTP POST 请求而具有 HttpClient_sendRequest ()的其他 API?因为尽管进行了多次尝试、但这种 API 似乎对我无效并出现400个错误。  

    我使用 Postman 软件检查 POST 请求是否正常工作,通过 Postman 我得到了200响应。 这使我对我正在使用的内容感到自信、但可能是其他一些格式错误导致了400错误。 我基本上是从 TI SDK 文件夹中的 RTOS Httpget.c 示例演示代码中获取帮助。  

    如果您可以共享任何其他 方法或任何其他 API、我可以使用它们来发送非常好的 HTTP POST 请求。   

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mrudula:

    我只能向您指出我们的示例代码、API 的源代码以及我们的文档。

     您是在哪里以及何时获得 CC3235SF SDK V2.20的? 我们的最新 SDK 版本是7.10.00.13

    来自 https://www.ti.com/tool/download/SIMPLELINK-CC32XX-SDK 的图像

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Felicity:

    感谢您的建议。 我已转向更最新的 SDK 6.10版。  

    ret = HTTPClient_connect(httpClientHandle,"">https://baseurl.com",0,0);

    上面的函数调用给了我(-2006)。 示例。 在研究 SDK 内部的函数定义时、看起来像是函数调用  

    ret = SlNetSock_startSec(cli->ssock, secAttribs,
                                         SLNETSOCK_SEC_START_SECURITY_SESSION_ONLY |
                                         SLNETSOCK_SEC_BIND_CONTEXT_ONLY);

    函数 HttpClient_connect2()函数内部是一个给出错误 SLNETERR_RET_CODE_INVALID_INPUT 的函数-2006。  

    这个 论坛问题 建议了一个 调用  ti_net_SlNet_initconfig ()的解决方案;该解决方案在 syscfg 文件夹中的 ti_net_config.c 文件中生成。  

    我 实现了该目标、但仍然面临相同的误差。 我该如何处理这一问题?  

    这就是生成的 ti_net_SlNet_initconfig()在我看来是这样的-  

    /* This generated function must be called after the network stack(s) are
     * initialized.
     */
    int32_t ti_net_SlNet_initConfig() {
        int32_t     status = 0;
        static bool slNetInitialized = false;
    
        if (slNetInitialized == false) {
            slNetInitialized = true;
    
            status = SlNetIf_init(0);
    
            if (status == 0) {
                status = SlNetSock_init(0);
            }
    
            if (status == 0) {
                SlNetUtil_init(0);
            }
    
            if (status == 0) {
                status = SlNetConn_init(0);
            }
    
    
            /* add CONFIG_SLNET_0 interface */
            if (status == 0) {
                status = SlNetIf_add(SLNETIF_ID_1, "wlan0",
                        (const SlNetIf_Config_t *)&SlNetIfConfigWifi,
                        5);
            }
    
        }
        return (status);
    }

    我是否需要对生成的代码进行任何更改? 我是否应该将"wlan0"更改为"CC3220"? 不确定?  

    还有一点,当我从基本 URL 中删除"https://"部分时,我看不到这个错误。 但是、如果我不在基址 URL 中添加"https://"部分、则 SDK 会通过端口80而不是端口443来稍后发送 POST 请求。 这会导致400个错误的请求错误。 因此,在基 URL 前面包含"https://"似乎很重要。  

    非常感谢您的耐心和帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的  Mrudula:

    1.您是否计划使用 HttpClient_connect()或 HttpClient_connect2() ?

    2.在您的实施中,您将 httpClientHandle (参数1)声明为什么类型?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否设置 HTTPS 服务器的证书?

    这似乎与该问题有关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Felicity:

    我正在使用  HttpClient_connect()。

    这是我定义 httpClientHandle 的方式

    HTTPClient_Handle httpClientHandle;
        
    httpClientHandle = HTTPClient_create(&statusCode,0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kobi:

    我没有设置证书、因为当我尝试通过 Postman 软件发送此帖子请求时、我成功获得了响应。 我不在那里添加任何证书。

    我将研究如何设置证书、然后回复给您。 感谢您的建议。   

    我应该为以下结构指定值吗?  

    /*用户需要使用的结构用于安全性*/

    typedef 结构 HttpClient_extSecParams

    {

      const char * privateKey/*私钥*/

      const char * clientCert;/* Client certificate */

      const char * RootCA/*根 CA */

    } HttpClient_extSecParams;

    或者、是否有任何 API 可用于设置证书?

    姆鲁杜拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果要使用安全连接(HTTPS),则必须至少设置服务器的根 CA (3参数)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我确实做到了这一点,它解决了我的问题!! 非常感谢 Kobi! 感谢您的提示帮助