2013-08-21 2 views
1

모두, BLS에서 데이터를 가져 오기 위해 컬 요청을 구현하려고합니다. 자신의 예를 here을 (그들이 컬 요청을 보여)에 따라, 내 코드는 다음과 같습니다cURL 및 요청 라이브러리를 사용하는 BLS API 데이터?

import requests 
headers = {'Content-type': 'application/json'} 
params = {"seriesid":["LEU0254555900", "APU0000701111"],"startyear":"2002", "endyear":"2012"} 
p = requests.post('http://api.bls.gov/publicAPI/v1/timeseries/data/', params = params,headers = headers) 
print p.url 
print p.content 

나는 다음 (오류) 출력 받고 있어요 :

http://api.bls.gov/publicAPI/v1/timeseries/data/?seriesid=LEU0254555900&seriesid=APU0000701111&endyear=2012&startyear=2002

{ "상태를 ":"REQUEST_FAILED ","responseTime ": 0,"message ": ["죄송합니다. 내부 오류가 발생했습니다. 입력 매개 변수를 확인한 후 요청을 다시 시도하십시오. "],"결과 ": null}

누구나 BLS API와 Python을 처리해야합니까? 요청 라이브러리가 가장 적합합니까?

+0

를 보조 노트로 : 당신은 ''콘텐츠 - Type''가 아닌' '콘텐츠 - type''를 원한다. HTTP 헤더는 [대소 문자를 구별하지 않도록 정의되었습니다.] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), 대부분의 서버가 제대로 처리 할 것입니다. 거기에 쓰여진 서버들, 그리고 더 많은 프록시들, 로그 파서 (log parsers) 등은 잘못 이해합니다. 따라서 일반적으로 표준 정규화를 사용하는 것이 좋습니다. 또는 귀하의 경우 포팅 할 샘플과 동일한 대문자 사용을 선택하는 것이 일반적입니다. – abarnert

답변

3

데이터를 json으로 보내야하며 params dict로 전달하지 않아야합니다. params은 원하는 매개 변수가 아닌 url 매개 변수를 설정하고 data으로 전달해야합니다.

이 작동합니다 :

import requests 
import json 
headers = {'Content-type': 'application/json'} 
data = json.dumps({"seriesid":["LEU0254555900", "APU0000701111"],"startyear":"2002", "endyear":"2012"}) 
p = requests.post('http://api.bls.gov/publicAPI/v1/timeseries/data/', data=data, headers=headers) 
print p.url 
print p.content 
+0

POST에서 'params'는 URL 쿼리 문자열 대신 url-form-encoded post 데이터로 전송 될 수 있습니다 ... 그러나 어느 쪽이든간에, 폼 형식 대신 JSON 인코딩 된 데이터를 원한다는 것을 마술처럼 알 수는 없습니다. 인코딩하고 그런 식으로 보내면 분명히 옳은 대답입니다. – abarnert

+0

@abarnert - 어떻게 결론에 도달했는지 물어봐도 될까요? [docs] (http://www.python-requests.org/en/latest/api/#requests.request)는 명시 적으로 쿼리 문자열에'params'가 전송 될 것이라고 말합니다. – mata

+0

'requests'를 사용하여 프로젝트를 작성하고 디버깅합니다. 프로젝트가 1.0 이전에 작성되었고 1.2보다 훨씬 적게 작성되었다는 점을 감안할 때, 상황이 바뀌었을 가능성이 매우 높습니다. (하지만 어쨌든 요점은 일반 POST 전송 방법에서 JSON 인코딩을 원한다는 것을 마법 라이브러리가 판단 할 수 없다는 것입니다. 따라서 응답은 일반 용도의 HTTP 라이브러리에 적합하다는 것을 거의 보장합니다.) – abarnert