【问题标题】:Python convert curl command to urllib.requestPython 将 curl 命令转换为 urllib.request
【发布时间】:2021-12-14 14:48:51
【问题描述】:

我想把我的curl to urllib.request命令转换成python,curl命令:

curl -v -i -X POST http://api.textart.io/img2txt.json --form image=@path/to/dir/file.jpg

我的代码:

import json
from urllib import request, parse

data = parse.urlencode({
    "image": open("path/to/dir/file.jpg", "rb")
}).encode()

req = request.Request("http://api.textart.io/img2txt.json")
req.add_header('User-Agent', 'Mozilla/5.0')
response = json.loads(request.urlopen(req, data).read())
response = json.dumps(response, indent=4)

print(response)

回复:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator at
 webmaster@api.textart.io to inform them of the time this error occurred,
 and the actions you performed just before this error.</p>
<p>More information about this error may be available
in the server error log.</p>
</body></html>

虽然 curl 有效,但请帮忙。

【问题讨论】:

  • 谢谢,但现在我有一个新错误,我编辑我的答案
  • 如果你会使用requests,那么你可以使用门户curlconverter.com来转换它。
  • 您可以在curlpython 中使用地址httpbin.org/post - 它应该发回您发送到此网址的所有信息 - 您可以比较结果以查看差异。
  • 我想我看到了一个问题 - 在 Python 中,您发送 GET 而不是 POST

标签: python curl request urllib pycurl


【解决方案1】:

如果您使用模块requests 而不是urllib,那么您可以使用门户http://curlconverter.com 来转换它。但有时它可能会创建错误的代码。


如果您要使用程序postman 来测试网页,那么它还具有生成不同语言代码的功能 - 它应该具有在Python 中为urllib 生成的功能。


您还可以使用门户https://httpbin.org(和网址httpbin.org/post)来测试curlpython中的请求。 Portal 发回它在请求中获得的所有数据,您可以比较您在 curlpython 中发送的数据。


但我在Linux本地程序netcat上使用模拟服务器,看到raw请求。

nc -l localhost 8080

然后用http://localhost:8080 测试curlurllib

并创建了应该与api.textart.io一起使用的代码

from urllib import request
import json
    
file_data = open("path/image.jpg", "rb").read()

BOUNDARY = b'------------------------360768b014779354'

data = [
    b'--' + BOUNDARY,
    b'Content-Disposition: form-data; name="image"; filename="image.jpg"',
    b'Content-Type: image/jpeg',
    b'',
    file_data,
    b'--' + BOUNDARY + b'--',
    b'',
]

data = b'\r\n'.join(data)
#print(data)

url = "http://api.textart.io/img2txt.json"
#url = "https://httpbin.org/post"
#url = 'http://localhost:8080'

req = request.Request(url)

req.add_header("Content-Type", 'multipart/form-data; boundary={}'.format(BOUNDARY.decode())), 
#req.add_header("Content-Length", str(len(data)))
#req.add_header("Accept", "*/*")

response = json.loads(request.urlopen(req, data).read())
response = json.dumps(response, indent=4)
print(response)

【讨论】: