1

Scala でこの API http://api.atinternet-solutions.com/toolbox/reporting.asmxにポスト リクエストを作成したいのですが、 最初は次のようなカールで行いました。

curl -X POST -T post.txt -H "Content-Type: application/soap+xml; charset=utf-8" http://api.atinternet-solutions.com/toolbox/reporting.asmx -v 

そして、私は期待したものを手に入れました。

ここで、単純な HttpClient を使用してプログラムで API を呼び出したい

val httpClient = new DefaultHttpClient()
def postRequest=new HttpPost("https://api.atinternet-solutions.com/toolbox/reporting.asmx")
postRequest.addHeader("Content-Type","application/soap+xml ; charset=utf-8")
postRequest.addHeader("SOAPAction","\"http://www.xiti.com/queryReport\"")
val file=new File("post.txt")
val fe=new FileEntity(file,"application/soap+xml;charset=utf-8")
postRequest.setEntity(fe)
val httpResponse=httpClient.execute(postRequest)
println(httpResponse.getStatusLine.toString)
val rspStr=Source.createBufferedSource(httpResponse.getEntity.getContent).mkString
println(rspStr)

しかし、HTTP/1.1 500 Internal Server Error が発生し、rspStr が出力されます

"?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><soap:Code><soap:Value>soap:Receiver</soap:Value></soap:Code><soap:Reason><soap:Text xml:lang="en">Server was unable to process request. ---&gt; Root element is missing.</soap:Text></soap:Reason><soap:Detail /></soap:Fault></soap:Body></soap:Envelope"

post.txt は以下のようになりますが、代わりに適切な情報を設定します。

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <NXHeader xmlns="http://www.xiti.com/">
      <GUID>string</GUID>
      <SecurityKey>string</SecurityKey>
      <Site>int</Site>
    </NXHeader>
  </soap12:Header>
  <soap12:Body>
    <queryReport xmlns="http://www.xiti.com/">
      <startDate>int</startDate>
      <endDate>int</endDate>
      <query>string</query>
      <param>string</param>
      <typereport>XML or CSV</typereport>
    </queryReport>
  </soap12:Body>
</soap12:Envelope>

動作している curl アクションは、私の scala プロジェクト ディレクトリから実行されます。post.txt を scala で出力したところ、適切なコンテンツが得られました。

何が問題なのかわかりません。ご協力ありがとうございました

4

2 に答える 2

3

ディスパッチ ライブラリで呼び出しを試みました。

これは私のコードです

import dispatch._
import java.io.File

object ToolBox {

    val endpoint =  url("https://api.atinternet-solutions.com/toolbox/reporting.asmx").POST
        .addHeader("Content-Type","application/soap+xml ; charset=utf-8")
        .addHeader("SOAPAction",""" "http://www.xiti.com/queryReport" """)

    def report = Http( endpoint <<< new File("post.txt") > as.xml.Elem)

    def tryReport = {
        val res = report.either
        for {
            ex <- res.left
        } yield "Something got wrong " + ex.getMessage
    }

}

サービスはあなたのようにステータス 500faultStringで応答しますが、応答 xml は次のとおりです。A parameter is missing in your NXHeader or you have a namespace issue.

本文には、実際のパラメーターではなく、クエリ レポートpost.txtの例からのプレースホルダーのみが含まれているため、期待どおりでしょうか?

于 2012-12-06T09:45:57.387 に答える
1

私は何がうまくいかなかったのかを見つけました。交換

def postRequest 

val postRequest.

もう一度お願いします

于 2012-12-06T16:56:16.700 に答える