POST 요청을 JSON으로 보내려면 어떻게해야합니까?


105
data = {
        'ids': [12, 3, 4, 5, 6 , ...]
    }
    urllib2.urlopen("http://abc.com/api/posts/create",urllib.urlencode(data))

POST 요청을 보내고 싶지만 필드 중 하나가 숫자 목록이어야합니다. 어떻게 할 수 있습니까? (JSON?)


1
그래도 이미 숫자 목록이 아닌가요?
Waynn Lue

API가 어떤 종류의 입력을 기대하는지 모르면 대답 할 수 없습니다.
Niklas B.

1
@WaynnLue API 서버는 목록이 아닌 문자열로 가져옵니다.
TIMEX

1
헤더를 "application / json"등으로 설정해야합니까?
TIMEX

답변:


154

서버에서 POST 요청이 json이 될 것으로 예상하는 경우 헤더를 추가하고 요청에 대한 데이터를 직렬화해야합니다.

Python 2.x

import json
import urllib2

data = {
        'ids': [12, 3, 4, 5, 6]
}

req = urllib2.Request('http://example.com/api/posts/create')
req.add_header('Content-Type', 'application/json')

response = urllib2.urlopen(req, json.dumps(data))

Python 3.x

https://stackoverflow.com/a/26876308/496445


헤더를 지정하지 않으면 기본 application/x-www-form-urlencoded유형이됩니다.


질문이 있습니다. 이 콘텐츠 형식 및 클라이언트 ID를 ... @jdi처럼 ... 헤더에 여러 항목을 추가 할 수 있습니다
오마르 Jandali

@OmarJandali, add_header()추가하려는 각 헤더에 대해 다시 호출 하십시오.
jdi

다음 코드가 있지만 아무것도 인쇄하지 않습니다. 그것은 url 및 헤더를 인쇄했는데 아무것도 인쇄되지 않았다 ... req = urllib.Request('http://uat-api.synapsefi.com') req.add_header('X-SP-GATEWAY', 'client_id_asdfeavea561va9685e1gre5ara|client_secret_4651av5sa1edgvawegv1a6we1v5a6s51gv') req.add_header('X-SP-USER-IP', '127.0.0.1') req.add_header('X-SP-USER', '| ge85a41v8e16v1a618gea164g65') req.add_header('Content-Type', 'application/json') print(req)...
오마르 Jandali

urllib2가 인식되지 않아서 방금 urllib를 사용했습니다. 또한 요청에 오류가 있습니다. The view tab.views.profileSetup didn't return an HttpResponse object. It returned None instead. @jdi
오마르 Jandali

@OmarJandali,이 답변은 원래 python 2.x에서 2012 년에 제공되었음을 명심하십시오. Python3을 사용하고 있으므로 가져 오기가 다릅니다. 이제 import urllib.requesturllib.request.Request(). 또한 req 객체를 인쇄하는 것은 흥미로운 일이 아닙니다. 인쇄하여 헤더가 추가되었음을 명확하게 볼 수 있습니다 req.headers. 그 외에도 응용 프로그램에서 작동하지 않는 이유를 알 수 없습니다.
jdi


66

파이썬 3.4.2의 경우 다음이 작동한다는 것을 알았습니다.

import urllib.request
import json      

body = {'ids': [12, 14, 50]}  

myurl = "http://www.testmycode.com"
req = urllib.request.Request(myurl)
req.add_header('Content-Type', 'application/json; charset=utf-8')
jsondata = json.dumps(body)
jsondataasbytes = jsondata.encode('utf-8')   # needs to be bytes
req.add_header('Content-Length', len(jsondataasbytes))
print (jsondataasbytes)
response = urllib.request.urlopen(req, jsondataasbytes)

1
Python3.6.2가 작동했습니다. req.add_header (...)로 헤더를 추가하는 것만으로도 효과적이었습니다.
Shalin LK

18

이는 Python 3.5URL에 쿼리 문자열 / 매개 변수 값이 포함 된 경우에 완벽하게 작동 합니다.

요청 URL = https://bah2.com/ws/rest/v1/concept/
매개 변수 값 = 21f6bb43-98a1-419d-8f0c-8133669e40ca

import requests

url = 'https://bahbah2.com/ws/rest/v1/concept/21f6bb43-98a1-419d-8f0c-8133669e40ca'
data = {"name": "Value"}
r = requests.post(url, auth=('username', 'password'), verify=False, json=data)
print(r.status_code)

7
코드
스니퍼

4

헤더를 추가해야합니다. 그렇지 않으면 http 400 오류가 발생합니다. 코드는 python2.6, centos5.4에서 잘 작동합니다.

암호:

    import urllib2,json

    url = 'http://www.google.com/someservice'
    postdata = {'key':'value'}

    req = urllib2.Request(url)
    req.add_header('Content-Type','application/json')
    data = json.dumps(postdata)

    response = urllib2.urlopen(req,data)

2

다음은 Python 표준 라이브러리에서 urllib.request 객체를 사용하는 방법의 예입니다.

import urllib.request
import json
from pprint import pprint

url = "https://app.close.com/hackwithus/3d63efa04a08a9e0/"

values = {
    "first_name": "Vlad",
    "last_name": "Bezden",
    "urls": [
        "https://twitter.com/VladBezden",
        "https://github.com/vlad-bezden",
    ],
}


headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
}

data = json.dumps(values).encode("utf-8")
pprint(data)

try:
    req = urllib.request.Request(url, data, headers)
    with urllib.request.urlopen(req) as f:
        res = f.read()
    pprint(res.decode())
except Exception as e:
    pprint(e)

1

lastest requests 패키지 json에서 requests.post()메서드의 매개 변수를 사용 하여 json dict를 보낼 수 있으며 Content-Typein 헤더는로 설정됩니다 application/json. 헤더를 명시 적으로 지정할 필요가 없습니다.

import requests

payload = {'key': 'value'}

requests.post(url, json=payload)

이것은 기술적으로 유효하지 않은 작은 따옴표가있는 POSTed json이됩니다.
Jethro

@Jethro 작은 따옴표를 사용할 때 오류를 관찰 했습니까? Python에서 작은 따옴표를 사용하는 것은 유효합니다. 개인적으로 나는 이것과 관련하여 어떤 문제도 만난 적이 없습니다.
jdhao

Aah 죄송합니다. 내 서버가 작은 따옴표로 된 JSON을 받고 있다고 생각했지만 별도의 문제와 오해의 소지가있는 디버깅으로 판명되었습니다. 건배, 헤더를 수동으로 지정하는 것보다 훨씬 깔끔합니다!
Jethro

0

이것은 api로 나를 위해 잘 작동합니다.

import requests

data={'Id':id ,'name': name}
r = requests.post( url = 'https://apiurllink', data = data)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.