2016-12-22 7 views
0

私はBashでリクエストを受け取りました。それをPython 2.7に翻訳する必要があります。私はこの種の翻訳を何度もやりましたが、今はそれを動作させることができず、理由を理解できません。私が実行した場合このリクエストをBashからPythonに変換しますか?

{ 
    "username":"[email protected]", 
    "password":"password", 
    "shortName":"a-short-name", 
    "visibility":"PRIVATE", 
    "sitePreset":"site-dashboard", 
    "title":"A Title", 
    "description":"A description." 
} 

:その内容は、次のいずれかのファイルfile.json、で

curl -X POST -v -u [email protected]:password --data "@file.json" -H "Content-Type:application/json" http://destination_url_a 

すべてのまず、私は、このバッシュ要求を与えられました私のコンピュータのバッシュライン、結果は成功です。

いつものように、私はrequestsライブラリをPythonで使って動作させようとしました。私がやったことです:ステータスコードが200あるにもかかわらず、

import requests 
from requests.auth import HTTPBasicAuth 
import json 

data = { 
    "username": "[email protected]", 
    "password": "password", 
    "shortName": "a-short-name", 
    "visibility": "PRIVATE", 
    "sitePreset": "site-dashboard", 
    "title": "A Title", 
    "description": "A description.", 
} 
headers = {'Content-Type': 'application/json'} 
data_json = json.dumps(data) 

r = requests.post(
    url='http://destination_url_a', 
    data=data_json, 
    headers=headers, 
    auth=HTTPBasicAuth('[email protected]', 'password'), 
    verify=False, 
) 

残念ながら、r変数に格納された応答は、エラーが、あります。

何が起こっている可能性がありますか?誰かが私のコードで問題を見つけたのか、何か考えがありますか?しかしEDIT

、これは別の例では、完全に働いている非常によく似ています。

バッシュ:

curl -v -H "Content-Type:application/json" -X POST --data "@file.json" -u [email protected]:password http://destination_url_b 

私のPythonコード

import requests 
from requests.auth import HTTPBasicAuth 
import json 

data = { 
    "userName": "[email protected]", 
    "password": "password", 
    "firstName": "Firstname", 
    "lastName": "Lastname", 
    "email": "[email protected]", 
    "disableAccount": "False", 
    "quota": -1, 
    "groups": ["a_group",], 
} 
headers = {'Content-Type': 'application/json'} 
data_json = json.dumps(data) 

r = requests.post(
    url='http://destination_url_b', 
    data=data_json, 
    headers=headers, 
    auth=HTTPBasicAuth('[email protected]', 'password'), 
    verify=False, 
) 

他のリクエストとほぼ同じようですが、これは機能します。異なるデータが送信され、別のサブドメインに送信されます(両方が同じドメインに送信されます)。あなたが言及したUser-Agentについて話している場合、これらの変更は重要ですか?

+0

同じように見えます。 http:// httpbinによる唯一の違いです。org/postはユーザエージェントであり、 '' Accept-Encoding ''は ''要求から '' gzip、deflate ''です。 –

+0

本当に 'auth = HTTPBasicAuth( 'user @ domain'、 'password')'はこのデータがあなたの 'JSON'にすでに存在しているので、送る必要がありますか?また、 '' Content-Type'''を指定する必要はありません...問題を特定するのに役立つ情報が、応答からありますか? – Andersson

+0

@AnderssonいくつかのWebサーバーでは、コンテンツタイプヘッダーが必要です.OPは 'json'ではなく' data'引数を使用しているので、ここでは自動的に指定されません。 –

答えて

0

最後に、ユーザーエージェントでもコードにもエラーはありませんでした。

問題は、宛先アプリケーションが同じ短縮名の値を持つサイトを受け入れなかったことです。

私がやっていたことは、Bashからサイトを作成して、それをアプリのインターフェースから削除し、同じデータでPythonから作成しようとしていたことです。サイトを削除したにもかかわらず、残ったデータをアプリのゴミ箱から削除しなければならなかったので、私はそれを行う際にエラーが発生していました。そうでない場合は、作成しようとしていたサイトが既に存在していたと考えてエラーを返しました。

もし私がそれぞれの試みで異なるショートネームを導入したのであれば、私は何の誤りもないでしょう。

0

ウェブサービスがユーザエージェントでフィルタリングすることがあります。 curlとpythonのユーザーエージェントは異なっています。それは説明するかもしれない。 リクエストヘッダーを変更して「正当な」ユーザーエージェントを作成しようとします。

+0

質問を編集しました。してください、見てください;) – forvas

関連する問題