[파이썬] requests 콘텐츠 협상

In web development, content negotiation refers to the process of negotiating the best representation of a resource based on the client’s preferences. This is achieved by allowing the client and server to communicate and agree on the most suitable content type (e.g., JSON, XML, HTML) and encoding (e.g., gzip, deflate) for the response.

By using the popular Python library called requests, content negotiation becomes straightforward and seamless. The requests library provides built-in features to handle content negotiation during HTTP requests.

Setting the Accept Header

The most common way to perform content negotiation with requests is by setting the Accept header in the HTTP request. The Accept header specifies the desired content types in order of priority, separated by commas. Here’s an example:

import requests

url = "https://api.example.com/resource"
headers = {
    "Accept": "application/json, text/plain, */*",
}

response = requests.get(url, headers=headers)

In the above example, we set the Accept header to specify that we prefer a response in JSON format. If JSON is not available, we fallback to plain text (text/plain) and finally, we accept any other content type (*/*).

Handling the Response

Once the request is made, requests will internally handle the content negotiation process and retrieve the best representation based on the server’s response. You can access the obtained content type using the response.headers dictionary.

import requests

url = "https://api.example.com/resource"
headers = {
    "Accept": "application/json, text/plain, */*",
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    content_type = response.headers.get("content-type")
    
    if "application/json" in content_type:
        # Handle JSON content
        json_data = response.json()
        print(json_data)
    elif "text/plain" in content_type:
        # Handle plain text content
        text_data = response.text
        print(text_data)
    else:
        # Handle other content types
        ...

In the above example, we check the content-type from the response headers to determine the type of data returned by the server. If the content type is application/json, we parse the response using response.json() and handle the JSON data accordingly. If the content type is text/plain, we retrieve the response as plain text using response.text.

Additional Considerations

Content negotiation with requests simplifies the process of fetching the most suitable representation of a resource based on the client’s preferences. By setting the Accept header and handling the response accordingly, you can ensure a seamless and efficient communication between your Python application and the server.