2016-07-12 4 views
0

Google App Engine(エンドポイントを使用しない)にREST APIを構築しています。これにより、ユーザーはCSVやタブ区切りのファイルをアップロードして重複する可能性のあるものを検索できます。 APIなので、<form>やBlobStoreのupload_urlは使用できません。私はまた、このAPIを呼び出す単一のWebクライアントを持つことに頼ることはできません。代わりに、ユーザーは理想的には、要求のbodyでファイルを送信します。POST要求本体で改行が削除されましたか?

私の問題は、タブ区切りファイルの内容を読み込もうとすると、すべての改行文字が削除されていることが分かります。そのため、コンテンツを行に分割する方法がありません。

私はPythonインタプリタ上で直接ファイルの内容を確認した場合、私はタブや改行があることがわかり(出力例では切り捨てです)

>>> with open('./data/occ_sample.txt') as o: 
...  o.read() 
... 
'id\ttype\tmodified\tlanguage\trights\n123456\tPhysicalObject\t2015-11-11 11:50:59.0\ten\thttp://creativecommons.org/licenses/by-nc/3.0\n...' 

RequestHandlerはリクエストボディの内容をログに記録します:

import logging 
class ReportApi(webapp2.RequestHandler): 
    def post(self): 
     logging.info(self.request.body) 
     ... 

だから私は、APIがdev_appservercurl経由

curl -X POST -d @data/occ_sample.txt http://localhost:8080/api/v0/report 
で実行して呼び出したとき

これは、ログに表示:あなたが見ることができるように、(それぞれrights123456)ヘッダと最初のレコードの最後の値の間には何もありません

id type modified language rights123456 PhysicalObject 2015-11-11 11:50:59.0 en http://creativecommons.org/licenses/by-nc/3.0 

と同じで最後の値で発生各レコードの最初のレコードと次のレコードの最初のレコード。

私はここで何かが分かりませんか? self.request.bodyself.request.body_fileself.request.POSTのデータをロードしようとしましたが、動作していないようです。私はまた、Content-Typetext/csv,text/plain,application/csvをリクエストヘッダーに適用しようとしましたが、成功しませんでした。別のContent-Typeを追加する必要がありますか?

答えて

1

curlコマンドラインオプションを使用してファイルデータを送信しています。このオプションは改行を削除しています。

-dオプションあなたのデータを解析し、application/x-www-form-urlencoded要求を送信し、それストリップはを改行法curl manpage

-d, --data <data>

[...]

あなたは手紙@とデータを起動した場合、残りの部分は、からデータを読み込むためのファイル名でなければなりませんか- curlでstdinからデータを読み取る場合は、複数のファイルも指定できます。 'foobar'というファイルからのデータの転記は、--data @foobarで行われます。 --dataにそのようなファイルからの読み込みを指示すると、キャリッジリターンと改行は取り除かれます

太字強調。

ではなく --data-binaryオプションを使用します。

--data-binary <data>

(HTTP)この記事データを正確に一切の余分な処理で指定されました。

@という文字でデータを開始する場合、残りはファイル名にする必要があります。 --data-asciiの場合と同様の方法でデータが転記されますが、改行と改行は保存され、変換は行われません。ただし、です。

あなたその場合にはContent-Typeヘッダを含めることができます。もちろん、あなたがそのヘッダを気にしているなら、あなたのハンドラに依存します。

+0

ありがとうございます!私は '--data-binary'で試してみましたが、それは魅力的でした。 – JOT

関連する問題