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.

[参考译文] CC3235S:HTTP 客户端 GET 请求

Guru**** 2487425 points
Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1207540/cc3235s-http-client-get-request

器件型号:CC3235S
主题中讨论的其他器件:UNIFLASH

您好!

我将使用 SDK 中的 HTTP 客户端示例进行 GET 请求。 当我将 www.google.com 用作 HOSTNAME 时、它工作正常、我收到了 google 主页 html 以响应请求。 但是,当我用服务器链接替换相同的,我得到响应代码为404。 但是,如果我在基于 PC 的软件中使用相同的服务器链接,像 Postman 这样,我可以看到我的服务器完美地提供预期的响应获取请求。 下面是代码片段。 是否有任何关于这一问题的指导?

----------------

#define HOSTNAME"我的服务器链接"
#define Request_URI "/"
#define USER_AGENT "HttpClient (ARM;TI-RTOS)"
#define HTTP_MIN_RECV (256)

HttpClient_extSecParams secparams;

void functiona (void){

HttpClient_Handle httpClientHandle;
int16_t 状态代码;
httpClientHandle = HttpClient_create (&statusCode、0);
if (statusCode < 0)

display_printf (display、0、0、"httpTask:http 客户端句柄创建失败:%d "、
状态代码);

}

display_printf (display、0、0、"httpTask:客户端创建 ok\n");

RET =
HttpClient_setHeader (httpClientHandle、
HttpClient_HFIELD_REQ_USER_AGENT、//HttpClient_HFIELD_REQ_content_TYPE、
user_agent、strlen (user_agent)+1、
HttpClient_HFIELD_persistent);
if (ret < 0)

display_printf (display、0、0、"httpTask:设置请求标头失败:%d "、
RET);
}

display_printf (display、0、0、"httpTask:set header ok\n");

RET = HttpClient_CONNECT (httpClientHandle、HOSTNAME、&secparams、0);//&secparams 是必需的、否则此 API 不返回
if (ret < 0)

display_printf (display、0、0、"httpTask:连接失败:%d "、
RET);
}

display_printf (display、0、0、"httpTask:client connect ok\n");

RET =
HttpClient_sendRequest (httpClientHandle、HTTP_METHOD_Get、Request_URI
空、0、//sizeof (msg)、
0);
if (ret < 0)

Display_printf (display、0、0、"httpTask:发送失败:%d "、
RET);
}

display_printf (display、0、0、"httpTask:send request ok\n");

if (ret!= HTTP_SC_OK)

Display_printf (DISPLAY、0、0、"httpTask:无法获取 STATUS:%d "、
RET);
}

Display_printf (DISPLAY、0、0、"HTTP 响应状态代码:%d\n "、
RET);

LEN = 0;
操作

RET = HttpClient_readResponseBody (httpClientHandle、data、sizeof (data)、
moreDataFlag)(&M);
if (ret < 0)

display_printf (display, 0, 0,"httpTask:响应正文处理失败:%d ",
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)

Display_printf (DISPLAY、0、0、"httpTask:断开失败:%d "、
RET);
}

HttpClient_Destroy (httpClientHandle );

}

  

谢谢。

Pradeep

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

    Pradeep、您好!

    您似乎正在尝试安全连接到您的服务器、因为您正在设置"ret = HttpClient_connect (httpClientHandle、HOSTNAME、&secparams、0);"

    "secparams"需要指向 保存在闪存中的服务器证书的名称(证书本身可以通过 uniflash 添加到闪存、或将证书复制到目录中的用户文件中)。

    有关如何使用证书的更多信息、请参阅本用户指南:

    https://www.ti.com/lit/ug/swpu332a/swpu332a.pdf?ts=1679242410366&ref_url=https%253A%252F%252Fwww.google.com%252F

    然后设置  secparams:

    HttpClient_extSecParams extSecParams =

    空,/*私钥*/
    null,/*客户端证书*/
    "我的服务器链接 证书"/*根 CA */
    };

    位于 Httpget.c 中

    同时确保设置了正确的时间、用于验证证书。

    此外,请确保您能够 ping 通服务器。

    此致、

    AVI

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

    您好、Avi:

    感谢您的回复。

    错误是  request_URI 的错误定义。  

    完整的链接是 https://myserver.com/f1/f2/f3。在此  Request_URI 应为/f1/f2/f3、而 HOSTNAME 应为 myserver.com。 在进行这些修改后是有效的。

    在同一行中、现在我实现了 POST 请求。 我收到 POST 请求中的错误400。 您是否具有 POST 请求的示例代码?

    谢谢。

    Pradeep

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

    嘿 Pradeep、

    很高兴听说上一个问题已解决。

    但如果您查看 demos/mqtt_client/ifmod/ota_vendor_dropbox.c 行316和361、则没有此方面的指定示例  

    在 OTA_Dropbox_getDownloadLink ()函数中有一个使用 HTTP_METHOD_POST 的示例。
    此致、
    AVI
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Avi:

    我在 SDK 中没有看到此文件、这可能是因为我使用的是 SDK 版本4.1。 在哪个版本的 SDK 中可以找到此文件? 我正在使用 Simplelink SDK 4.10中的 Azure SDK、因此我不想安装其他版本的 SimpleLink SDK。 您可以选择是否发送此文件或在此处复制粘贴相关代码?

    谢谢。

    Pradeep

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    int32_t OTA_Dropbox_getDownloadLink (FileServerParams_t * pServerParams){
      int32_t ret;
      GDL_BUFFER_t*缓存;

      HttpClient_Handle httpClientHandle = NULL
      int16_t jsonSize;
      uint16_t linkSize;
      JSON_Handle listFolderTemplateHandle、getLinkTemplateHandle;
      JSON_Handle getLinkObjectHandle;


      //在堆上分配缓冲区和输出 URL。
      buff =(GDL_buffer_t*) calloc (1sizeof (GDL_buffer_t));

      if (缓存)
      {
        Log_info("***尝试使用 Dropbox getDownloadLink***");

        //创建用于解析 list_folder 请求响应的模板。
        RET = JSON_createTemplate (&listFolderTemplateHandle、list_folder_RES_JSON_TEMPLATE、
                     strlen (LIST_FOLDER_RES_JSON_TEMPLATE);
        if (ret < 0){
          log_error ("创建 JSON 模板失败:%d);
        }
        方案
        {
          RET = HTTP_setupConnection (&httpClientHandle、HOSTNAME、NULL、NULL、Dropbox_ROOT_CA、 Alt_dropbox_root_CA、0);
        }

        if (ret =0)
        {
          char * pReqURI = list_folder_REQ_URI;

          //使用 list_folder API 调用设置第一个 HTTP POST 请求。
          strcpy (buff->data、list_folder_req_data);

          执行
            //发送 HTTP POST 请求(list_folder)
            log_debug ("===发送 POST 请求==\r\n URI:%s\r\n 数据:%s"、pReqURI、buff->data);
            RET = HTTP_setHeaders (httpClientHandle、NULL、APP_TOKEN、content_TYPE、HttpClient_HFIELD_NOT_PERSISTENT);
            if (ret =0)
            {
              RET = HttpClient_sendRequest (httpClientHandle、
                             HTTP_METHOD_POST、pReqURI、
                             buff->data,strlen (buff->data),
                             0);
              log_debug ("HTTP 响应状态代码:%d"、ret);
    #ifdef OATH2_support
              if (ret == HTTP_SC_UNauthorized)
              {
                GetTempToken (httpClientHandle、buff->data);
              }其他
    #endif
              if (ret < 0){

                log_error ("POST 请求失败:%d"、ret);
                免费(缓存);
                返回(RET);
              }
            }
            //将 JSON 响应从 POST 请求读取到数据缓冲区
            RET = ReadHTTPResponse (httpClientHandle、buff->data);
            if (ret < 0){// Negative on error
              免费(缓存);
            }
            方案
            {
              buff->data[ret]=0

              RET = ParseListFolderResponse (listFolderTemplateHandle、buff->data、ret);

              //使用 list_folder/Continue API 调用设置下一个 HTTP POST 请求。
              pReqURI = LIST_FOLDER_CONT_REQ_URI;
            }
          } while (ret == D_keep_looking_for_new_version);//仅当文件夹中有更多文件需要检查时才继续。

          if (ret == OTA_VENTER_NO_NEW_IMAGE_FOUND)
          {
            Log_info ("***未找到新图像!! ***");
          }
          否则为(ret == OTA_VENTER_NEW_IMAGE_FOUND)
          {
            //发送 HTTP POST 请求(GET_LINK)
            log_debug ("\n\n===发送 POST 请求==\r\n URI:%s\r\n 数据:%s"、get_link_REQ_URI、buff->data);
            RET = HTTP_setHeaders (httpClientHandle、NULL、APP_TOKEN、content_TYPE、HttpClient_HFIELD_NOT_PERSISTENT);
            if (ret =0)
            {
              RET = HttpClient_sendRequest (httpClientHandle、
                             HTTP_METHOD_POST、GET_LINK_REQ_URI
                             buff->data,strlen (buff->data),
                             0);
              if (ret < 0){
                log_error ("POST 请求失败:%d"、ret);
              }
              方案
              {
                log_debug ("HTTP 响应状态代码:%d"、ret);

                //将 JSON 响应从 POST 请求读取到数据缓冲区
                log_debug ("Reading JSON\r\n");
                memset (buff->data0、MAX_buff_data_LEN);
                jsonSize = ReadHTTPResponse (httpClientHandle、buff->data);
                if (jsonSize < 0){
                  REt = jsonSize;
                }
                方案
                {
                  //创建用于解析 list_folder 请求响应的模板。
                  RET = JSON_createTemplate (&getLinkTemplateHandle、get_link_RES_JSON_TEMPLATE、
                               strlen (get_link_res_json_template);
                  if (ret < 0){
                    log_error ("创建 JSON 模板失败:%d);
                  }
                  方案
                  {
                    //设置 JSON 对象以读取条目
                    RET = JSON_CreateObject (&getLinkObjectHandle、getLinkTemplateHandle、0);
                    if (ret < 0){
                      log_error ("创建 JSON 对象失败:%d);
                    }
                    方案
                    {
                      REt = JSON_PARSE (getLinkObjectHandle、buff->data、jsonSize);
                      if (ret < 0){
                        log_error ("解析 JSON 失败:%d、ret);
                      }
                      方案
                      {
                        //从 JSON 响应获取下载链接大小。
                        RET = JSON_getValue (getLinkObjectHandle、"\"link\"、
                                  ,&linkSize);
                        if (ret < 0){
                          log_error ("JSON getValue (链路大小)失败:%d、ret);
                        }
                        方案
                        {

                          //从 JSON 响应获取下载链接。
                          memset (buff->data0、MAX_buff_data_LEN);
                          RET =
                              JSON_getValue (getLinkObjectHandle、"\"link\"、
                                     缓存->数据);
                          if (ret < 0){
                            log_error ("JSON getValue (link)失败:%d"、ret);
                          }
                          方案
                          {
                            linkSize = strlen (buff->data);
                            memcpy (pServerParams->URLbuff->data、linkSize);
                            pServerParams->URL[linkSize]='\0'
                            pServerParams->pVersion = NULL/* NULL 表示将再次比较该版本
                              标记为 OTA_IF 中的时间戳
                              tar 文件(是文件名的一部分)。
                              如果版本需要其他版本、请确保
                              为它分配空间(并在
                              downloadImage 调用返回)。 */
                            pServerParams->pClientCert = NULL
                            pServerParams->pPrivateKey = NULL
                            pServerParams->pRootCa1 = Dropbox_root_ca;
                            pServerParams->pRootCa2 = ALT_DROB_ROOT_CA;

                            Log_info("*** New Image Found:(url:%s)***"pServerParams->URL);
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
          //关闭 HTTP 连接并销毁关联的对象。
          if (HttpClient_disconnect (httpClientHandle)< 0){
            log_error ("http 断开连接失败:%d"、ret);
          }
          if (HttpClient_Destroy (httpClientHandle)< 0){
            log_error ("destroy failed:%d"、ret);
          }
        }
        免费(缓存);

      }
      返回(RET);
    }