POST с JSON работает в Postman, но не в Python - PullRequest
1 голос
/ 21 марта 2019

Публикация с данными Json завершается с ошибкой Python (оба 2.7 или 3.6), выдавая ошибку «500 Внутренняя ошибка сервера», но работает от Почтальона.Запуск сценария python из командной строки Windows 7.

#!/usr/bin/env python
import urllib
import urllib2

url = 'http://<server>:<port>/web/services/notes2'
cont_type = 'application/json; charset=utf-8'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
values = {
    "LK_IN_BRANCH": "00123",
    "LK_IN_ACCOUNT": "12345678",
    "LK_IN_ENTRY_DATE": "20190315",
    "LK_IN_ENTRY_TIME": "12300111",
    "LK_IN_HOLD_DATE": "20190331",
    "LK_IN_EMP_INITS": "QTC",
    "LK_IN_COMMENT": "Comment from py script-notes2",
    "LK_IN_USER_ID": "Hxxxxxxx",
    "LK_IN_NOTE_GROUP": " "}
headers = {
    "User-Agent": user_agent,
    "Content-Type": cont_type,
    "Accept": user_agent,
    "Accept-Encoding": "gzip, deflate"}

try:
    data = urllib.urlencode(values)
    req = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(req)
    json = response.read()
    print json
except urllib2.URLError as e:
    if hasattr(e, 'reason'):
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason
    if hasattr(e, 'code'):
        print 'The server couldn\'t fulfill the request.'
        print 'Error code: ', e.code

Если я добавлю «Content-Length» ТО ЖЕ, поскольку почтальон получит ошибку «400 Bad request». POST-запрос / ответ в Postman Console

POST-запрос работает с использованием стороннего пакета 'Requests' с моей машины, но, к сожалению, в реальной среде не может быть установлено 'Requests', поэтому необходимо, чтобы он работал со стандартнымвстроенные модули Python.Также скрипт Python со встроенными модулями для GET работает без проблем.Буду признателен за любую помощь с вопросом.

1 Ответ

2 голосов
/ 21 марта 2019

Вы установили заголовок Content-Type на application/json, но отправили данные как application/x-www-form-urlencoded. Это может быть причиной ответа HTTP 400.

Попробуйте отправить ваши данные в виде строки JSON:

#!/usr/bin/env python
import json
import urllib2

url = 'http://httpbin.org/post'
cont_type = 'application/json; charset=utf-8'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
values = {
    "LK_IN_BRANCH": "00123",
    "LK_IN_ACCOUNT": "12345678",
    "LK_IN_ENTRY_DATE": "20190315",
    "LK_IN_ENTRY_TIME": "12300111",
    "LK_IN_HOLD_DATE": "20190331",
    "LK_IN_EMP_INITS": "QTC",
    "LK_IN_COMMENT": "Comment from py script-notes2",
    "LK_IN_USER_ID": "Hxxxxxxx",
    "LK_IN_NOTE_GROUP": " ",
}
headers = {
    "User-Agent": user_agent,
    "Content-Type": cont_type,
    "Accept": user_agent,
}

try:
    data = json.dumps(values)
    req = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(req)
    json = response.read()
    print json
except urllib2.URLError as e:
    if hasattr(e, 'reason'):
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason
    if hasattr(e, 'code'):
        print 'The server couldn\'t fulfill the request.'
        print 'Error code: ', e.code
...