2016-12-27 1 views
0

私はR.400の悪い要求を引き起こすhttr :: POSTとは違った処理をするcurlは何ですか?

Materials Project web APIからドキュメントをデータを照会しようとしているがcurlpythonの両方を使用して行われるクエリの例を提供します。以下のcurlコマンドをコピーしました。

curl -s --header "X-API-KEY: <YOUR-API-KEY>" \ 
    https://materialsproject.org/rest/v2/query \ 
    -F criteria='{"elements": {"$in": ["Li", "Na", "K"], "$all": ["O"]}, "nelements": 2}' \ 
    -F properties='["formula", "formation_energy_per_atom"]' 

httr quickstart guideを読んでから、私がこのクエリを再現することができるはず私には思える:curlコマンドは、マテリアルプロジェクトデータベースからJSONデータを返しながら、私のRクエリ、

library(httr) 
POST(url = "https://www.materialsproject.org/rest/v2/query", 
    config = add_headers("X-API-KEY" = "<YOUR-API-KEY>",  
    body = list(criteria = "{'elements': {'$in': ['Li', 'Na', 'K'], '$all': ['O']}, 'nelements': 2}", 
       properties = "['formula', 'formation_energy_per_atom']"), 
    encode = "multipart", 
    verbose()) 

しかし、 HTTP/1.1 400 BAD REQUESTを返します。上のコードでは、httrとは違ったカールとは何ですか?

私は-vをカールに置き、それを上記の出力(verbose())と比較しようとしましたが、カールはマルチパートのフォームに表示されていません。

> Expect: 100-continue 
> Content-Type: multipart/form-data; boundary=------------------------d2ef2f3982185118 
> 
< HTTP/1.1 100 Continue 
< HTTP/1.1 200 OK 
< Date: Tue, 27 Dec 2016 21:18:58 GMT 
< Server: Apache/2.2.15 (CentOS) 
< Vary: Accept-Encoding,User-Agent 
< Connection: close 
< Transfer-Encoding: chunked 
< Content-Type: application/json 

一方httrショー:

-> Content-Type: multipart/form-data; boundary=----------------------------5b4873dbc9cd 
-> 
<- HTTP/1.1 100 Continue 
>> ------------------------------5b4873dbc9cd 
>> Content-Disposition: form-data; name="criteria" 
>> 
>> {'elements': {'$in': ['Li', 'Na', 'K'], '$all': ['O']}, 'nelements': 2} 
>> ------------------------------5b4873dbc9cd 
>> Content-Disposition: form-data; name="properties" 
>> 
>> ['formula', 'formation_energy_per_atom'] 
>> ------------------------------5b4873dbc9cd-- 

答えて

1

それは悪い&を遅延APIを実装して考え、本当にひどいです。彼らはPythonを気に入っているようですので、これは当然のことです。

次作品:

library(httr) 
library(jsonlite) 

list(
    criteria=toJSON(list(
    elements=list(
     `$in`=c("Li", "Na", "K"), 
     `$all`=c("0") 
    ), 
    nelements=unbox(2) 
)), 
    properties=toJSON(c("formula", "formation_energy_per_atom")) 
) -> params 

POST(url="https://www.materialsproject.org/rest/v2/query", 
    add_headers(`X-API-KEY`=Sys.getenv("MATERIALS_PROJECT_API_KEY")), 
    body=params, 
    encode="multipart", verbose()) -> res 

、ここではそれを証明するverbose()出力です:

-> POST /rest/v2/query HTTP/1.1 
-> Host: www.materialsproject.org 
-> User-Agent: libcurl/7.51.0 r-curl/2.3 httr/1.2.1 
-> Accept-Encoding: gzip, deflate 
-> Accept: application/json, text/xml, application/xml, */* 
-> X-API-KEY: wouldntyouliketoknow 
-> Content-Length: 344 
-> Expect: 100-continue 
-> Content-Type: multipart/form-data; boundary=------------------------34f08173ce0a7818 
-> 
<- HTTP/1.1 100 Continue 
>> --------------------------34f08173ce0a7818 
>> Content-Disposition: form-data; name="criteria" 
>> 
>> {"elements":{"$in":["Li","Na","K"],"$all":["0"]},"nelements":2} 
>> --------------------------34f08173ce0a7818 
>> Content-Disposition: form-data; name="properties" 
>> 
>> ["formula","formation_energy_per_atom"] 
>> --------------------------34f08173ce0a7818-- 

<- HTTP/1.1 200 OK 
<- Date: Wed, 28 Dec 2016 02:08:08 GMT 
<- Server: Apache/2.2.15 (CentOS) 
<- Vary: Accept-Encoding,User-Agent 
<- Content-Encoding: gzip 
<- Content-Length: 258 
<- Connection: close 
<- Content-Type: application/json 
<- 

それはスーパークエリ文字列構造好き嫌いです。彼らは本当にJSON本体を受け入れて、それを済ませたはずです。しかし、half-rededはPythonの人々の方法です。

ああ、私はちょうどそれが応答を提供するCentOSサーバーだと気づいた。うんそれらの人々は本当に痛みが好きです。

関連する問題