|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2021/4/14 16:50:04 |
标题: |
idhttp使用Post数据失败,有前辈来帮忙看一下什么原因,谢谢。 |
浏览:1943 |
|
加入我的收藏 |
楼主: |
function TForm1.PostDemo:string ; var IdHttp : TIdHTTP; IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL; Url : string; jsonToSend : TStringStream; postdata : TStringList; begin IdHttp := TIdHTTP.Create(nil); IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); IdHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL; IdHttp.HandleRedirects := True; IdHttp.Request.ContentType := 'application/json;charset=UTF-8'; IdHTTP.Request.AcceptCharSet := 'UTF-8'; IdHTTP.Request.AcceptEncoding := 'UTF-8'; IdHTTP.Request.AcceptLanguage := 'UTF-8'; IdHTTP.Request.CharSet := 'UTF-8'; IdHTTP.ProtocolVersion := pv1_1; jsonToSend := TStringStream.Create('',TEncoding.UTF8); postdata := TStringList.Create; try postdata.Text := '{"carNo":"苏A12345","piTare":1000,"GW":2000,"time":202103231026}'; url:='http://127.0.0.1:8884/api/CarInfo'; //本地测试地址 try IdHttp.Post(url,postdata,jsonToSend); Result :=jsonToSend.DataString; except on e : Exception do begin ShowMessage(e.Message); end; end; finally jsonToSend.free; IdHttp.free; end;
end;
----------------------------------------------
- |
作者: |
|
2021/4/14 17:39:56 |
1楼: |
我这前也是用类似这段代码连接短信发送服务,后改用TNetHttpClient,也是一直没有成功(最后改用C#处理的),因为无测试环境,原因也一直没有找到,总是提示:http 501错误。
----------------------------------------------
-
|
作者: |
|
2021/4/14 17:43:01 |
2楼: |
报错也不提供只能瞎鸡巴 猜 https分几种 ,你确定你的dll支持 网站用的? 有在线检测 自己丢地址检测吧(还特么能给你检测漏洞呢。) 不丢在线网站 直接关选项一个个试就知道是哪个咯,
此帖子包含附件:
大小:12.7K |
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
|
作者: |
|
2021/4/14 17:47:24 |
3楼: |
1楼 501 https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660#5_2
501 Not Implemented 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
|
作者: |
|
2021/4/14 17:54:02 |
4楼: |
收到,谢谢各位的讲解。
----------------------------------------------
-
|
作者: |
|
2021/4/14 19:49:35 |
5楼: |
在你的服务端地址方法名前加“update”,这样服务端接口方法就可以响应了 例如: function CarInfo(): Boolean; 修改为: function updateCarInfo(): Boolean;
----------------------------------------------
-
|
作者: |
|
2021/4/14 22:05:12 |
6楼: |
postdata : TStringList; 改为 postdata : String;
----------------------------------------------
-
|
作者: |
|
2021/5/13 22:38:39 |
7楼: |
收到,谢谢各位耐心讲解,问题解决了。
----------------------------------------------
-
|
作者: |
glwang (glwang) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/5/14 8:36:08 |
8楼: |
我发现很多时候Delphi程序员出了问题都第一时间怀疑是Delphi的问题,而不是自己的问题
----------------------------------------------
|
作者: |
|
2021/5/14 11:44:31 |
9楼: |
这个问题很好解决,做一张网页浏览器打开,然后POST自己要提交的数据,用HTTP调试工具抓包,看看浏览器是怎么做的,然后Delphi模拟即可。
本身Delphi写此类代码就是模拟浏览器的行为。
我见过好多网站在发送Get时,对Json代码进行Base64编码后提交的,有的发送Post也会对Json数据进行Base64编码……具体为什么要这样,我就不清楚了。
我这里只是把自己知道的有限信息提供给你参考
----------------------------------------------
http://www.lsworks.net
|
作者: |
|
2021/5/14 19:20:27 |
10楼: |
楼上,本身网页提交或者下载的数据,必须是符合 HTTP 协议的。
这种数据,可以是没任何格式的文本,也可能是图片,或者中文字符,等等。
JSON 数据,本质上是字符串。也有一些服务器要求的是 XML 数据而不是 JSON 数据。这个不重要,重要的是:它是字符串。
那么,服务器就会要求你对这些数据进行编码。也可能不要求进行编码。这个就要看 HTTP 页面里面的一些表头定义,比如编码方式,等等。编码方式也很多,比如有 BASE64,还有其它的编码方式。你去看 Indy 提供的控件,里面就有好几种编码方式的控件。
假设服务器要求你提供的数据必须按照什么方式编码,那你就必须要编码。最常见的是图片这种二进制数据,要求编码为 BASE64 的字符串再发送给服务器。当然,服务器也可能支持直接提交二进制数据,那就不用编码了。
总之,这些都是服务器方便的要求,做客户端的,搞清楚要求,自己的程序能满足要求,才可以传递数据给服务器。
----------------------------------------------
-
|
作者: |
|
2021/5/14 20:02:04 |
11楼: |
关于如何去研究一个 HTTP 服务器的规则,我有个实际的例子,就是微软的 Azure 存储服务,如何用 Delphi 去访问。我写了一个比较详细的研究过程的博客,有兴趣的可以参考一下:
https://blog.csdn.net/pcplayer/article/details/86763311?spm=1001.2014.3001.5501
其本质是: 1. HTTP 访问其实就是一个 TCP 的访问,其 URL 是服务器的地址,以及一些给服务器看的参数;对于 TCP 来说,其实只需要服务器的地址。
2. HTTP 的内容,就是一大段的文本,可能也包含二进制数据。
3. HTTP 内容的一大段文本里面,最前面是 HTTP 头。这个头也是一堆文本,描述了这个 HTTP 是 GET 还是 PUT 还是 POST,描述了编码方式,等等。有一堆的参数。不同的服务器要求的参数可能不同。
4. 搞清楚了 HTTP 的内容格式,自己使用 IdTCPClient 也可以去访问服务器;
5. 使用 IdHTTP 去访问服务器,可能需要使用 IdTHHP 的方法,自己构造一些服务器需要的参数,也就是 HTTP 头里面的一些数据。因为每个服务器可能需要不同的参数,控件无法知道,需要使用控件的人自己去做。IdHTTP 有相应的方法允许你增加 HTTP 的头的参数。其实最终就是在 HTTP 的文本内容的 HTTP 头部分增加了类似:MY_NAME:PCPLAYER 这样的内容。
----------------------------------------------
-
|
作者: |
|
2021/5/17 20:56:02 |
12楼: |
http 库不少问题,不稳定,我后台用go写个http提交
----------------------------------------------
-
|
作者: |
|
2021/7/8 9:43:21 |
13楼: |
看注册时间,你也是前辈了,不过你的问题,至少应该把错误的提示内容发出来吧
----------------------------------------------
-
|
|