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:无法使用 SDK 中提供的 HttpGet 示例、通过 http Post 方法使用服务器

Guru**** 2540720 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1126197/launchxl-cc3235sf-not-able-to-with-sever-via-http-post-method-by-using-httpget-sample-example-provided-in-the-sdk

器件型号:LAUNCHXL-CC3235SF

尊敬的 TI:   

    我无法与服务器连接、提供的示例 HttpGet 在 Get 方法中运行良好、而我尝试通过 POST 方法连接它时、它会引发以下错误。

这是我的 httptask...

void* httpTask(void *pvParameters)
{
    bool moreDataFlag = false;
    char data[HTTP_MIN_RECV];
    int16_t ret = 0;
    int16_t len = 0;

    Display_printf(display, 0, 0, "Sending a HTTP GET request to '%s'\n",
    HOSTNAME);

    HTTPClient_Handle httpClientHandle;
    int16_t statusCode;
    httpClientHandle = HTTPClient_create(&statusCode, 0);
    if (statusCode < 0)
    {
        printError("httpTask: creation of http client handle failed",
                   statusCode);
    }

    ret = HTTPClient_setHeader(httpClientHandle,
                               HTTPClient_HFIELD_REQ_AUTHORIZATION,
                               USER_AGENT, strlen(USER_AGENT) + 1,
                               HTTPClient_HFIELD_PERSISTENT);
    if (ret < 0)
    {
        printError("httpTask: setting request header failed", ret);
    }

    ret = HTTPClient_connect(httpClientHandle, HOSTNAME, 0, 0);
    if (ret < 0)
    {
        printError("httpTask: connect failed", ret);
    }
//    ret = HTTPClient_sendRequest(httpClientHandle, HTTP_METHOD_POST,
//                                 REQUEST_URI,
//                                 NULL,
//                                 0, 0);

    ret = HTTPClient_sendRequest(httpClientHandle, HTTP_METHOD_POST,
                                    REQUEST_URI,
                                    REQ_BODY,
                                    strlen(REQ_BODY), 0);

    if (ret < 0)
    {
        printError("httpTask: send failed", ret);
    }

    if (ret != HTTP_SC_OK)
    {
        printError("httpTask: cannot get status", ret);
    }

    Display_printf(display, 0, 0, "HTTP Response Status Code: %d\n", ret);

    len = 0;
    do
    {
        ret = HTTPClient_readResponseBody(httpClientHandle, data, sizeof(data),
                                          &moreDataFlag);
        if (ret < 0)
        {
            printError("httpTask: response body processing failed", ret);
        }
        Display_printf(display, 0, 0, "%.*s \r\n", ret, data);
        len += ret;
    }
    while (moreDataFlag);

    Display_printf(display, 0, 0, "Received %d bytes of payload\n", len);

    ret = HTTPClient_disconnect(httpClientHandle);
    if (ret < 0)
    {
        printError("httpTask: disconnect failed", ret);
    }

    HTTPClient_destroy(httpClientHandle);
    return (0);
}

相关的宏

#define HOSTNAME              ""www.example.com"">jxxxxxxxx.jxx.com"/.../www.example.com"
#define REQUEST_URI           "/jxx/bootstrap/api/v1/device/auth"  //  "/"
#define USER_AGENT            "HTTPClient (ARM; TI-RTOS)"
#define HTTP_MIN_RECV         (256)

const char *REQ_BODY = "{\"deviceKey\":\"p0RbSjlkw+EiqaGIXrQ1\",\"cn\":\"jxxxxxxxx.jxx.com\",\"svc\":\"svc330000469\"}";

实际上,我们正在尝试连接自举 Sever,每当我们的 MCU 通电时,它就需要使用 POST 方法向服务器发送请求,因为 device_id 将以 json 的形式发送到服务器。 关于 IT 服务器、我们将发送其他详细信息、我们将在后续操作中使用这些信息。  

这次连接是我遇到的主要问题、是第一次尝试使用 POST 方法进行连接(Get 方法运行良好)。 请帮助我解决此问题。

提前感谢、

sarju

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

    您的 REQ_body 实际上已发送,您可以在 PHP 服务器端使用 诸如 file_get_contents ('php://input')之类的内容进行验证;

    问题是、您不会在应用程序头中发送内容类型、因此它会被服务器接收但丢弃。 添加如下内容:

    HttpClient_setHeader (httpClientHandle、HttpClient_HFIELD_REQ_content_type、"application/json"、strlen ("application/json")、HttpClient_HFIELD_NOT_PERSISTENT);

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

    您好 Sarju、

    您获得的错误代码是-2006、这意味着参数无效。 看一下您的代码、您似乎已经正确地放置了所有内容。 我建议您仔细检查 HOSTNAME 是否为有效站点、因为我认为问题所在。

    此致、

    Rogelio

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

    感谢您的回复!

                 现在情况已经发生了一些变化。 请参阅随附的屏幕截图

    这是我的代码

    void* httpTask(void *pvParameters)
    {
        bool moreDataFlag = false;
        char data[HTTP_MIN_RECV];
        int16_t ret = 0;
        int16_t len = 0;
    
        Display_printf(display, 0, 0, "Sending a HTTP POST request to '%s'\n",
        HOSTNAME);
    
        HTTPClient_Handle httpClientHandle;
        int16_t statusCode;
        httpClientHandle = HTTPClient_create(&statusCode, 0);
        if (statusCode < 0)
        {
            printError("httpTask: creation of http client handle failed",
                       statusCode);
        }
    
        ret = HTTPClient_setHeader(httpClientHandle,
                                    HTTPClient_HFIELD_REQ_AUTHORIZATION,
                                    USER_AGENT, strlen(USER_AGENT) + 1,
                                    HTTPClient_HFIELD_PERSISTENT);
    
        if (ret < 0)
        {
            printError("httpTask: setting request header failed", ret);
        }
    
        /*suggested header settings*/
        ret = HTTPClient_setHeader(httpClientHandle, HTTPClient_HFIELD_REQ_CONTENT_TYPE, "application/json", strlen("application/json"), HTTPClient_HFIELD_PERSISTENT);
    
        if (ret < 0)
        {
            printError("httpTask: setting request header failed", ret);
        }
    
        // setting charset=utf-8
        ret = HTTPClient_setHeader(httpClientHandle,HTTPClient_HFIELD_REQ_ACCEPT_CHARSET,"charset=utf-8", strlen("charset=utf-8"), HTTPClient_HFIELD_PERSISTENT);
    
        if (ret < 0)
        {
          printError("httpTask: setting request header failed", ret);
        }
    
        ret = HTTPClient_setHeaderByName(httpClientHandle,HTTPClient_HFIELD_REQ_CONTENT_TYPE,"x-api-key","d5da633b5e341xxxxxxxxxxxb6d26a66e007edca0924c482c194b5962ebc276242c", strlen("d5da633b5e341xxxxxxxxxxxb6d26a66e007edca0924c482c194b5962ebc276242c"), HTTPClient_HFIELD_PERSISTENT);
    
        if (ret < 0)
        {
          printError("httpTask: setting request header failed", ret);
        }
    
        ret = HTTPClient_setHeaderByName(httpClientHandle,HTTPClient_HFIELD_REQ_CONTENT_TYPE,"x-app-name","bss_exxxn_client", strlen("bss_exxxn_client"), HTTPClient_HFIELD_PERSISTENT);
    
        if (ret < 0)
        {
          printError("httpTask: setting request header failed", ret);
        }
    
        ret = HTTPClient_setHeaderByName(httpClientHandle,HTTPClient_HFIELD_REQ_CONTENT_TYPE,"x-svc","svc3xxx3469", strlen("svc3xxx3469"), HTTPClient_HFIELD_PERSISTENT);
    
        if (ret < 0)
        {
          printError("httpTask: setting request header failed", ret);
        }
    
        ret = HTTPClient_connect(httpClientHandle, HOSTNAME, 0, 0);
        if (ret < 0)
        {
            printError("httpTask: connect failed", ret);
        }
    
        ret = HTTPClient_sendRequest(httpClientHandle, HTTP_METHOD_POST,
                                        REQUEST_URI,
                                        REQ_BODY,
                                        strlen(REQ_BODY), 0);
    
        if (ret < 0)
        {
            printError("httpTask: send failed", ret);
        }
    
        if (ret != HTTP_SC_OK)
        {
            printError("httpTask: cannot get status", ret);
        }
    
        Display_printf(display, 0, 0, "HTTP Response Status Code: %d\n", ret);
    
        len = 0;
        do
        {
            ret = HTTPClient_readResponseBody(httpClientHandle, data, sizeof(data),
                                              &moreDataFlag);
            if (ret < 0)
            {
                printError("httpTask: response body processing failed", ret);
            }
            Display_printf(display, 0, 0, "%.*s \r\n", ret, data);
            len += ret;
        }
        while (moreDataFlag);
    
        Display_printf(display, 0, 0, "Received %d bytes of payload\n", len);
    
        ret = HTTPClient_disconnect(httpClientHandle);
        if (ret < 0)
        {
            printError("httpTask: disconnect failed", ret);
        }
    
        HTTPClient_destroy(httpClientHandle);
        return (0);
    }

    正如您在代码中看到的、我在标头中添加了一些键和值。 请告诉我服务器未回复的错误位置、并且我不断收到错误

    错误! 代码= 400、说明= httpTask:无法获取状态

    帮助我摆脱这个问题。

    再次感谢!

    sarju

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

    感谢您的支持、我们已完成、连接!