Not getting response through request API - python

I am getting proper response from API when I am passing integer value directly but I am not getting any response when I am passing integer through variable.
​
# Extarct information of Metadata of Design id-5071431
import requests
url = "https://www.helioscope.com/api/designs/5071431"
payload={}
headers = {
'access_token': 'API_key',
}
​
response = requests.request("GET", url, headers=headers, data=payload)
# <Response [200]>
des=5071431
# Extarct information of Metadata of Design id-5071431
import requests
url = "https://www.helioscope.com/api/designs/{des}"
payload={}
headers = {
'access_token': 'API_key',
}
response = requests.request("GET", url, headers=headers, data=payload)
# <Response [500]>
Attached are the screenshots for the same
enter image description here
enter image description here
Thanks in advance

response.text will show the server response body
{des} should be replaced with an actual ID like you did in the first request
when I am passing integer through variable.
You're not using an f-string for loading any variables into the string, so it's taken as a literal. You could also just concatenate at the end

Related

How to create a simple REST api WEB application with Python

We can make REST api application with spring boot by start.spring.io web site easily, anyone know any good website through which I can get the skeleton REST api project with python? My intention is to make REST api application with python.
One of the ways to do this is by using the requests module in Python. Import it into your code with the following command:
import requests
Now, each API is different, so you'll have to see with the vendor what the requirements are. For testing and learning purposes, I recommend using httpbin (https://httpbin.org). You can test pretty much anything there.
Here are a few simple requests:
#returning status
url = 'https://httpbin.org/post'
response = requests.post(url)
print(response.status_code)
print(response.ok)
#sending data/getting text response
url = 'https://httpbin.org/post'
params = {'Jello':'World'}
response = requests.post(url, params=params)
print(response.text)
#sending data/getting json response
url = 'https://httpbin.org/post'
params = {'Jello':'World'}
response = requests.post(url, params=params)
print(response.json())
#sending time data to server
import datetime
url = 'https://httpbin.org/post'
params = {'Time':f'{datetime.datetime.now()}'}
response = requests.post(url, params=params)
print(response.text)
#Params vs Data
#params
url = 'https://httpbin.org/post'
params = {'username':'jsmith','password':'abc123'}
response = requests.post(url, params=params)
print(response.text)
#data
url = 'https://httpbin.org/post'
payload = {'username':'jsmith','password':'abc123'}
response = requests.post(url, data=payload)
print(response.text)
# ********* HEADERS **********
url = 'https://httpbin.org/get'
response = requests.get(url)
print(response.text)
url = 'https://httpbin.org/post'
headers = {'content-type': 'multipart/form-data'}
response = requests.post(url,headers=headers)
print(response.request.headers) #client request headers
print(response.headers) #server response headers
print(response.headers['content-type']) #request header value from server
To use actual APIs, I suggest RapidAPI (https://rapidapi.com/), which is a hub where you can connect to thousands of APIs. HEre is a sample code using Google translate:
#RapidAPI
#Google Translate
import requests
url = "https://google-translate1.p.rapidapi.com/language/translate/v2"
text = 'Ciao mondo!'
to_lang = 'en'
from_lang = 'it'
payload = f"q={text}&target={to_lang}&source={from_lang}"
headers = {
'content-type': "application/x-www-form-urlencoded",
'accept-encoding': "application/gzip",
'x-rapidapi-host': "google-translate1.p.rapidapi.com",
'x-rapidapi-key': "your-API-key"
}
response = requests.post(url, data=payload, headers=headers)
print(response.json()['data']['translations'][0]['translatedText'])

How to get json text by request with header details?

I would like to go to page https://losoviny.iamroot.eu/part_one and write json text from there.
End at first I must login in https://losoviny.iamroot.eu/part_one_login and use
details in header.
But if If I run code I see:
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Do you know how to rewrite it?
(Header data are correct)
Thank you
import json
import requests
headers = {
'username': 'Loskarlos',
'password': 'JednohoDneOvladnuKSI'
}
response = requests.post('https://losoviny.iamroot.eu/part_one_login', headers=headers)
response_get = requests.get('https://losoviny.iamroot.eu/part_one ')
response_get = json.loads(response_get.json())
print(response_get)
First you need to get the token from https://losoviny.iamroot.eu/part_one_login in order to test the API use postman. Your initial response is not a header element. It is a form, use below code to get the token.
import requests
url = "https://losoviny.iamroot.eu/part_one_login"
payload={'username': '<User NAME>',
'password': '<Password>'}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
After this I have no idea to pass the token header as per below code. Use header parameters when consuming the part_one endpoint. For header use Bearer format to build the Authorization header parameter.
import requests
url = "https://losoviny.iamroot.eu/part_one"
payload={}
headers = {
'Authorization': 'Bearer <TOKEN>'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
As a practice use postman like tool to navigate an API. cheers!!!
import requests
url = "https://losoviny.iamroot.eu/part_one_login"
payload={'username': 'Loskarlos',
'password': 'JednohoDneOvladnuKSI'}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

REST API post request results in successful request but not creation

I've been trying to make a Post Request to my CRM API. The CRM API is very vague:
"You can use POST request when you wish to create records. You POST a JSON encoded string to the servers and it will return a single instance of the record."
POST /{object_name}
Example:
Request URL (POST):
/accounts
Request Body (JSON):
{
"name": "testing API"
}
I've had plenty of success making GET requests regularly, but POST is not working out so easily.
url = "https://apiv4.reallysimplesystems.com/accounts?<KEY>"
payload = {"name":"Ziggy","owner":"XYZ","addresscounty/state":"Awe","source":"Space"}
headers = {
'Content-Type': 'application/json',
'Cookie': 'XSRF-TOKEN=<TOK>; really_simple_systems_session=<KEY>'
}
response = requests.post(url, headers=headers, data=payload)
I get a status code 200 when I run this, but I'm really looking for that 201. The only clue that I've got to follow at this point is that when I run:
response.json()
I get the error:
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
I've tried switching the response parameters to json:
response = requests.post(url, headers=headers, json=payload)
I've tried ensuring that my payload is json by using json.dumps():
payload = {"name":"Ziggy","owner":"XYZ","addresscounty/state":"Awe","source":"Space"}
payload = json.dumps(payload)
And I've tried all sorts of other shenanigans that I can't even recall at this point. Does anyone have any idea where I'm going wrong here? The 200 status code makes me feel painfully close.
Replace <AUTH_TOKEN> with your auth token
url = "https://apiv4.reallysimplesystems.com/accounts/"
payload = {"name":"Ziggy"}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer <AUTH_TOKEN>',
}
response = requests.post(url, headers=headers, data=payload)
Problem solved:
import json
import requests
url = "https://apiv4.reallysimplesystems.com/accounts"
payload = {"name":"RSS Test Joe Bloggs","addresscounty/state":"Maryland","source":"Word of Mouth"}
payload = json.dumps(payload)
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer <AUTH KEY>'
}
response = requests.post(url, headers=headers, data=payload)
Rather than using Postman's code which included the in the URL and used :
'Cookie': 'XSRF-TOKEN=<TOK>; really_simple_systems_session=<KEY>'
I replaced it with a standard Authorization header. Secondly, I found that using json.dumps(payload) and json = payload was resulting in a Bad Request.

API responds with Bad Request Error message

Could someone take a look at this code and let me know if there's something I'm doing wrong:
import requests
url = "https://api-end-point"
payload = {"grant_type": "client_credentials", "client_id":"my_ic", "client_secret": "not_now_please"}
headers = '{"accept": "application/json", "content-type": "application/json"}'
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
For some reason it's throwing error.
{"type":"http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html","title":"Bad Request","status":400,"detail":"JSON decoding error: Syntax error, malformed JSON"}
So first use json instead of data, second don't use ' around the headers, or actually you don't need to specify headers:
import requests
url = "https://api-end-point"
payload = {"grant_type": "client_credentials", "client_id":"my_ic", "client_secret": "not_now_please"}
response = requests.request("POST", url, json=payload)
print(response.text)
The page does not contain json/application but html/text. If you remove the headers then it works:
response = requests.request(method="POST", url=url, data=payload)
If you have special needs to specify in the headers add details to your question

Python Requests Code 141 Error

I'm trying to use requests in python to post a json dictionary to a url. I need to get a string back from the url but I keep getting a code 141 error -{"code":141,"error":"Missing a github repository link"}. I'm using this website(http://docs.python-requests.org/en/latest/user/quickstart/) to do requests.
Any ideas on why I keep getting that error? Code is below.
import requests
import json
payload = { "email" : "jade#gmail.com", "github" : "https://github.com/"}
headers = {'content-type': 'application/json', "Accept": 'application/json'}
r = requests.post("http://challenge.code2040.org/api/register", params = payload, headers = headers)
print(r.url)
print r.text
Update: The suggestion worked but now I'm getting an{"code":141,"error":"success/error was not called"} error when I try to save the response I recieve from the url into a variable and then post it back to a different url.
#Store the token into a variable
token = r.text
payload = { "token" : token}
headers = {'content-type': 'application/json', "Accept": 'application/json'}
r = requests.post("http://challenge.code2040.org/api/getstring", json = payload, headers = headers)
print r.text
Since you are making a POST request and you need to provide a JSON in the request body, use json argument, not params:
r = requests.post("http://challenge.code2040.org/api/register",
json=payload,
headers=headers)
(tested - got back a token)
Note that json argument was introduced in requests 2.4.2.

Categories

Resources